java stram流转map
时间: 2025-05-18 09:05:12 浏览: 13
### Java Stream 流转换为 Map 的方法
在 Java 中,`Stream` 接口提供了多种方式可以将 `Stream` 转换为 `Map`。以下是通过 `Collectors.toMap()` 方法实现的一个典型示例。
#### 示例代码
假设存在一个名为 `Person` 的类,其定义如下:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
下面是一个完整的例子,展示如何将 `List<Person>` 转换为 `Map<String, Integer>`,其中键为 `name`,值为 `age`。
```java
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
// 使用 Collectors.toMap 将 List 转换为 Map
Map<String, Integer> personMap = people.stream()
.collect(Collectors.toMap(Person::getName, Person::getAge));
System.out.println(personMap);
}
}
```
上述代码中,`Collectors.toMap()` 方法接收两个参数:一个是用于生成键的映射函数(这里是 `Person::getName`),另一个是用于生成值的映射函数(这里是 `Person::getAge`)。最终的结果是一个 `Map`,其中键为每个人的名字,值为其对应的年龄[^2]。
---
#### 处理 Key 重复的情况
当输入列表中的对象可能具有相同的键时,直接调用 `Collectors.toMap()` 可能会抛出异常 `IllegalStateException: Duplicate key`。为了避免这种情况,可以通过提供第三个参数来指定冲突解决方案。该参数是一个二元操作符,用于决定在遇到相同键时应保留哪个值。
修改后的代码如下所示:
```java
Map<String, Integer> personMapWithMerge = people.stream()
.collect(Collectors.toMap(
Person::getName, // 键提取器
Person::getAge, // 值提取器
(existingValue, newValue) -> existingValue // 解决冲突策略:保留旧值
));
System.out.println(personMapWithMerge);
```
在此版本中,`(existingValue, newValue)` 是一个 Lambda 表达式,它指定了当发生键冲突时的行为——这里选择了保留现有的值 (`existingValue`) 并忽略新值 (^1])。
---
#### 自定义目标 Map 类型
默认情况下,`Collectors.toMap()` 返回的是一个普通的 `HashMap` 实现。如果需要自定义返回的目标类型(例如 `TreeMap` 或其他类型的 `Map`),则可以在第四个参数中传入工厂方法。
以下是如何创建一个基于 `LinkedHashMap` 的实例以保持插入顺序的例子:
```java
Map<String, Integer> linkedHashMapExample = people.stream()
.collect(Collectors.toMap(
Person::getName,
Person::getAge,
(v1, v2) -> v1,
LinkedHashMap::new // 指定目标 Map 类型
));
```
此代码片段确保了结果集合不仅解决了潜在的关键字碰撞问题,还维持了原始条目的排列次序。
---
### 总结
利用 `Stream API` 和 `Collectors.toMap()` 函数能够方便快捷地把一系列实体转化为键值对形式存储于内存之中;同时针对可能出现的数据冗余情况也给出了相应的处理办法以及扩展选项说明。
阅读全文
相关推荐

















