简介:
本文主要介绍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/
特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。