gpt4 book ai didi

java - 如何在 collect 的 java 流中将 Map 转换为 Map

转载 作者:搜寻专家 更新时间:2023-11-01 01:31:26 25 4
gpt4 key购买 nike

假设您有一个人的列表,Roberts、Pauls、Richards 等,这些人按姓名分组到 Map<String, List<Person>> 中.你想找到最老的 Paul、Robert 等......你可以这样做:

public static void main(String... args) {
List<Person> 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<String, Integer> 形式的映射而不是 Map<String, Person> ,我可以这样做:

var mapping = people.stream().collect(groupingBy(Person::getName, mapping(Person::getAge, reducing(0, (p1, p2) -> p1 < p2 ? p2 : p1))));

上面的步骤是:

  • 按名称分组到 Map<String/*Name*/, List<Person>>
  • 映射List<Person>进入List<Integer>
  • 在这些列表中找到最大整数。

我想知道怎么做:

  • 按名称分组到 Map<String, List<Person>>
  • 找到每个组名中年龄最大的人,得到Map<String, Person>
  • 转换Map<String, Person>进入Map<String, Integer> .我想在 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*/)));

我怎样才能做到这一点?

最佳答案

使用 3-argument version of toMap collector 更直接:

people.stream().collect(toMap(
Person::getName,
Person::getAge,
Integer::max
));

关于java - 如何在 collect 的 java 流中将 Map<String, Person> 转换为 Map<String, Integer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com