微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用自定义收集器进行Java 8分组?

如何解决使用自定义收集器进行Java 8分组?

将Stream与分组时Collectors.groupingBy,可以使用自定义对值指定归约运算Collector在这里,我们需要使用Collectors.mapping,它需要一个函数(映射是什么)和一个收集器(如何收集映射的值)。在这种情况下,映射为Person::getName,即返回Person的名称方法引用,我们将其收集到中List

Map<Integer, List<String>> collect = 
    members.stream()
           .collect(Collectors.groupingBy(
               Person::getAge,
               Collectors.mapping(Person::getName, Collectors.toList()))
           );

解决方法

我有以下课程。

class Person {

    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;

    public int getAge() {
        return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();
    }

    public String getName() {
        return name;
    }
}

我希望能够按年龄分组,然后收集人员名称列表,而不是人员对象本身。全部以一个漂亮的lamba表达式表示。

为了简化所有步骤,我链接了当前的解决方案,该解决方案按年龄存储分组的结果,然后对其进行迭代以收集名称。

ArrayList<OtherPerson> members = new ArrayList<>();

members.add(new OtherPerson("Fred",IsoChronology.INSTANCE.date(1980,6,20),OtherPerson.Sex.MALE,"fred@example.com"));
members.add(new OtherPerson("Jane",IsoChronology.INSTANCE.date(1990,7,15),OtherPerson.Sex.FEMALE,"jane@example.com"));
members.add(new OtherPerson("Mark","mark@example.com"));
members.add(new OtherPerson("George",IsoChronology.INSTANCE.date(1991,8,13),"george@example.com"));
members.add(new OtherPerson("Bob",IsoChronology.INSTANCE.date(2000,9,12),"bob@example.com"));

Map<Integer,List<Person>> collect = members.stream().collect(groupingBy(Person::getAge));

Map<Integer,List<String>> result = new HashMap<>();

collect.keySet().forEach(key -> {
            result.put(key,collect.get(key).stream().map(Person::getName).collect(toList()));
});

当前解决方案

不理想,为了学习,我想有一个更优雅,更有效的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。