stream().collect(Collectors.toMap())
时间: 2024-05-18 22:11:07 浏览: 93
collect(Collectors.toMap()) 方法用于将 Stream 元素收集到一个 Map 对象中。它接受两个参数,一个是用于指定 Map 中的键的函数,另一个是用于指定 Map 中的值的函数。
例如,假设有一个包含学生姓名和对应分数的列表,我们可以使用 collect(Collectors.toMap()) 方法将这个列表转换为一个以学生姓名作为键,分数作为值的 Map 对象:
```java
List<Student> students = Arrays.asList(
new Student("Alice", 85),
new Student("Bob", 92),
new Student("Charlie", 78)
);
Map<String, Integer> studentScores = students.stream()
.collect(Collectors.toMap(Student::getName, Student::getScore));
// 输出结果
// {Alice=85, Bob=92, Charlie=78}
System.out.println(studentScores);
```
在上面的例子中,`Student` 类有 `getName()` 和 `getScore()` 方法分别返回学生姓名和分数。`collect(Collectors.toMap())` 方法使用 `Student::getName` 作为键的提取函数,使用 `Student::getScore` 作为值的提取函数,将学生列表转换为一个以学生姓名为键,分数为值的 Map 对象。
需要注意的是,如果列表中存在重复的键,那么 `toMap()` 方法会抛出 `IllegalStateException` 异常。为了避免这种情况,可以通过传递一个合并函数作为第三个参数来解决冲突,例如使用 `Math.max()` 来选择较高的分数:
```java
Map<String, Integer> studentScores = students.stream()
.collect(Collectors.toMap(
Student::getName,
Student::getScore,
Math::max
));
```
这样,在遇到重复的键时,会使用合并函数 `Math.max()` 来选择两个值中较高的分数作为最终的值。
阅读全文