首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java streams inside collect中如何将Map<String、Person>转换为Map<String、Integer>?

在java streams inside collect中如何将Map<String、Person>转换为Map<String、Integer>?
EN

Stack Overflow用户
提问于 2018-05-30 07:47:25
回答 3查看 195关注 0票数 4

假设你有一个人的列表,罗伯茨,保罗,理查兹等等,这些人按名字分组到Map<String, List<Person>>中。你想找最年长的保罗,罗伯特,等等。你可以这样做:

代码语言:javascript
运行
复制
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>的形式获得一个映射,我可以这样做:

代码语言:javascript
运行
复制
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<Integer>
  • Find最大整数。

我想知道该怎么做:

  • 按名称分组到Map<String, List<Person>>
  • 查找每个组名称中年龄最大的人,让Map<String, Person>
  • Map<String, Person>转换为Map<String, Integer>。我想在groupingBy's链中完成所有这些操作,减少‘s和And’s。

这是“伪代码”:

代码语言:javascript
运行
复制
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*/)));

我如何才能做到这一点?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50594490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档