Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData)
时间: 2023-08-12 07:33:23 浏览: 462
`Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData)` 是一个使用 `toMap` 方法的特殊形式,它的作用是将一个流(Stream)中的元素转换成一个 Map 对象,并且如果有重复的键,则使用新值覆盖旧值。
具体来说,它的语法如下:
```java
toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
```
其中,`keyMapper` 表示将流中元素转换成 Map 中的键(Key)的函数,`valueMapper` 表示将流中元素转换成 Map 中的值(Value)的函数,`mergeFunction` 表示当出现重复键时如何处理新旧值的合并。在这个特殊形式中,`keyMapper` 和 `valueMapper` 都使用了 `Function.identity()` 方法,它表示将元素本身作为键和值。
而 `mergeFunction` 则使用了一个简单的 lambda 表达式 `(oldData, newData) -> newData`,它表示当出现重复键时,使用新值覆盖旧值。
例如,假设有一个包含学生信息的列表,每个学生信息包含学生姓名和成绩,我们可以使用这个特殊形式的 `toMap` 方法将学生信息转换成一个以学生姓名为键,成绩为值的 Map 对象,代码如下:
```java
List<Student> students = Arrays.asList(
new Student("Tom", 90),
new Student("Jerry", 80),
new Student("Lucy", 85),
new Student("Tom", 95)
);
Map<String, Integer> studentMap = students.stream()
.collect(Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData));
System.out.println(studentMap);
```
其中,`Student` 类包含 `getName` 和 `getScore` 方法用于获取学生姓名和成绩,运行结果为:
```
{Tom=95, Jerry=80, Lucy=85}
```
即将学生姓名作为键,成绩作为值,转换成了一个 Map 对象,并且由于出现了重复的键(Tom),使用新值(95)覆盖了旧值(90)。
阅读全文