Java Stream Collectors.groupingBy实现对List(列表)进行分组的方法

本文介绍了如何使用Java8的StreamAPI中的Collectors.groupingBy方法,对自定义类Person的languagesSpoken属性进行分组,生成按语言分类的Person列表。flatMap用于连接流并保持元素,collect则用于汇总数据到Map结构。
摘要由CSDN通过智能技术生成

简介
本文主要介绍Java8以上版本中使用Stream Collectors.groupingBy,实现自定义类的对象List(列表)进行分组,生成Map(字典)分组数据。

1、示例Person类

public class Person {
   private String name;
   private int age;
   private List<String> languagesSpoken;
}

2、创建分分组的List

Person p1 = new Person("Bob", 21, Arrays.asList("English", "French", "German"));
Person p2 = new Person("Alice", 33, Arrays.asList("English", "Chinese", "Spanish"));
Person p3 = new Person("Joe", 43, Arrays.asList("English", "Dutch", "Spanish", "German"));
//存放到list中
List<Person> people = Arrays.asList(p1,p2,p3);

3、通过Collectors.groupingBy对会说的语言进行分组

Map<String, List<Person>> langPersons =
    people.stream()
          .flatMap(p -> p.getLanguagesSpoken()
                         .stream()
                         .map(l -> new SimpleEntry<>(l,p)))
          .collect(Collectors.groupingBy(Map.Entry::getKey,
                                         Collectors.mapping(Map.Entry::getValue,
                                                            Collectors.toList())));

方法说明:

1)flatMap(类似C# AddRange),将多个Stream连接成一个Stream,不是用新值取代Stream的值,与Map有所区别,会重新生成一个Stream对象取而代之。

2)collect就是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法是通过定义新的Collector接口来定义的。

了解更多分析及数据抓取可查看:
http://data.yisurvey.com:8989/
特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值