假设你有一个名单,罗伯茨,保罗,理查兹等,这些人按名字分组
Map>
. 你想找到最老的保罗、罗伯特等…你可以这样做:
public static void main(String... args) {
List people = Arrays.asList(
new Person(23, "Paul"),
new Person(24, "Robert"),
new Person(32, "Paul"),
new Person(10, "Robert"),
new Person(4, "Richard"),
new Person(60, "Richard"),
new Person(9, "Robert"),
new Person(26, "Robert")
);
Person dummy = new Person(0, "");
var mapping = people.stream().collect(groupingBy(Person::getName, reducing(dummy, (p1, p2) -> p1.getAge() < p2.getAge() ? p2 : p1)));
mapping.entrySet().forEach(System.out::println);
}
我想得到一个映射
Map
而不是
Map
,我可以这样做:
var mapping = people.stream().collect(groupingBy(Person::getName, mapping(Person::getAge, reducing(0, (p1, p2) -> p1 < p2 ? p2 : p1))));
以上步骤是:
按名称分组
Map>
绘制地图
List
进入之内
List
在这些列表中查找最大整数。
我在想怎么做:
按名称分组到
map>
在每个组名中查找最年长的人,获取
map
转换
映射
进入之内
映射
. 我想在GroupingBy、Reducing和Mapping的链中做所有这些。
这是“伪代码”:
var mapping = people.stream().collect(groupingBy(Person::getName, reducing(dummy, (p1, p2) -> p1.getAge() < p2.getAge() ? p2 : p1 /*, have to write some other collector factory method here*/)));
我怎样才能做到这一点?