List 用stream把某个字段一样的数据,比较取最大的
时间: 2024-02-22 12:56:07 浏览: 85
[] - 2022-06-04 改造BeanUtils,优雅实现List数据拷贝.pdf
假设有一个 `List<Person>`,其中 `Person` 类包含两个字段:`name` 和 `age`,现在要取出每个 name 对应的最大 age 值,可以使用 Stream API 来实现。具体代码如下:
```
List<Person> list = ...; // 假设这个 List 是我们要操作的对象
Map<String, Integer> maxAgeMap = list.stream()
.collect(Collectors.groupingBy(Person::getName, Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Person::getAge)),
p -> p.map(Person::getAge).orElse(0)
)));
```
上面的代码中,`groupingBy()` 方法可以将流中的元素按照指定的属性进行分组,这里使用 `Person::getName` 来按照 name 字段进行分组。`maxBy()` 方法可以取出一个 Comparator 最大的元素,这里使用 `Comparator.comparing(Person::getAge)` 来按照 age 字段进行比较。最后,使用 `collectingAndThen()` 方法将结果包装成一个 Map,并将最大值作为 value 值,存储在 Map 中。
在 `collectingAndThen()` 方法中,使用了一个 lambda 表达式,将 Optional 类型的结果转换为 Integer 类型。如果结果存在,就取出其中的 age 值,否则返回 0。
最终,`maxAgeMap` 中存储了每个 name 对应的最大 age 值。
阅读全文