私人订制网站建设,淘宝优惠劵网站怎么做,莱芜在线老板是谁,哪个网站帮别人做pptStream流的groupingBy
简单使用
业务场景#xff1a;现在有100个人#xff0c;这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key#xff1a;年龄 value#xff1a;数据列表
public void listToMapGroup() {//这里假设通过listStreamService.list();方法…Stream流的groupingBy
简单使用
业务场景现在有100个人这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key年龄 value数据列表
public void listToMapGroup() {//这里假设通过listStreamService.list();方法查询了这100人ListPerple list perpleService.list();//按照age进行分组MapInteger, ListPerple result list.stream().collect(Collectors.groupingBy(Perple::getAge));//打印结果result.forEach((k, v) - {System.out.println(k);System.out.println(v);System.out.println(--------------------);});
}效果相当于是把list这个集合里面存放的100个人每个人都调用Perple的getAge方法按照getAge方法的返回值进行分组。每个组是一个MapInteger, List类型的对象。MapInteger, List的键是getAge的返回值即分组的依据。MapInteger, List的值是这个年龄对应组中的成员。
如果要进行排序
分组之后是不能对每个分组进行比较的也就无法排序因为groupingBy是一个终结流。 Collectors.groupingBy(Function? super T, ? extends K classifier, Collector? super T, A, D downstream) 这里有两个思路 1:提前排序再进行分组 2:分组后对Map进行处理对其每个value排序
做法一
提前排序再进行分组. 这里还展示了一些groupingBy方法的扩展用法。
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {Student student1 new Student(1, 1);Student student2 new Student(1, 1);Student student3 new Student(2, 2);Student student4 new Student(2, 3);Student student5 new Student(3, 3);Student student6 new Student(3, 4);Student student7 new Student(4, 1);Student student8 new Student(4, 1);Student student9 new Student(4, 2);Student student10 new Student(4, 1);ListStudent list Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9, student10);System.out.println(--------- 根据字段分组求每个分组的sum ----------);MapInteger, Integer collect list.stream().collect(Collectors.groupingBy(Student::getId, Collectors.summingInt(Student::getScore)));System.out.println(collect.toString());System.out.println(--------- 根据字段分组求每个分组的count ----------);MapInteger, Long countMap list.stream().collect(Collectors.groupingBy(Student::getId, Collectors.counting()));System.out.println(countMap.toString());System.out.println(--------- 根据字段分组每个分组为对象的指定字段 ----------);MapInteger, ListInteger groupMap list.stream().collect(Collectors.groupingBy(Student::getId, Collectors.mapping(Student::getScore, Collectors.toCollection(ArrayList::new))));System.out.println(groupMap.toString());System.out.println(--------- 根据字段分组,默认分组 ----------);MapInteger, ListStudent defaultGroupMap list.stream().collect(Collectors.groupingBy(Student::getId));System.out.println(JSONObject.toJSONString(defaultGroupMap));System.out.println(--------- 根据字段分组每个分组按照指定字段进行生序排序 ----------);MapInteger, ListStudent sortGroupMap list.stream().sorted(Comparator.comparing(Student::getScore)).collect(Collectors.groupingBy(Student::getId));System.out.println(JSONObject.toJSONString(sortGroupMap));System.out.println(--------- 先排序再分组 ----------);MapInteger, ListStudent reversedSortGroupMap list.stream().sorted(Comparator.comparing(Student::getScore).reversed()).collect(Collectors.groupingBy(Student::getId));System.out.println(JSONObject.toJSONString(reversedSortGroupMap));}
}class Student {private Integer id;private Integer score;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public Integer getScore() {return score;}public void setScore(Integer score) {this.score score;}public Student(Integer id, Integer score) {this.id id;this.score score;}
}
执行结果
--------- 根据字段分组求每个分组的sum ----------
{12, 25, 37, 45}
--------- 根据字段分组求每个分组的count ----------
{12, 22, 32, 44}
--------- 根据字段分组每个分组为对象的指定字段 ----------
{1[1, 1], 2[2, 3], 3[3, 4], 4[1, 1, 2, 1]}
--------- 根据字段分组,默认分组 ----------
{1:[{id:1,score:1},{id:1,score:1}],2:[{id:2,score:2},{id:2,score:3}],3:[{id:3,score:3},{id:3,score:4}],4:[{id:4,score:1},{id:4,score:1},{id:4,score:2},{id:4,score:1}]}
--------- 根据字段分组每个分组按照指定字段进行生序排序 ----------
{1:[{id:1,score:1},{id:1,score:1}],2:[{id:2,score:2},{id:2,score:3}],3:[{id:3,score:3},{id:3,score:4}],4:[{id:4,score:1},{id:4,score:1},{id:4,score:1},{id:4,score:2}]}
--------- 先排序再分组 ----------
{1:[{id:1,score:1},{id:1,score:1}],2:[{id:2,score:3},{id:2,score:2}],3:[{id:3,score:4},{id:3,score:3}],4:[{id:4,score:2},{id:4,score:1},{id:4,score:1},{id:4,score:1}]}
做法二
先分组再排序。 先将数据进行groupingBy得到MapLong, List 在通过forEach对每个List进行排序 MapLong, ListStreamMapEntity map getMap();System.out.println(------ flatMap 处理MapLong,ListStreamMapEntity ------);System.out.println();System.out.println(初始数据 JSONObject.toJSONString(map));System.out.println();map.keySet().forEach(key - map.computeIfPresent(key, (k, v) - v.stream().sorted(Comparator.comparing(StreamMapEntity::getId).reversed()).collect(Collectors.toList())));System.out.println(处理map对map内的每个list进行排序);System.out.println(JSONObject.toJSONString(map));
执行结果
------ flatMap 处理MapLong,ListStreamMapEntity ------初始数据{1111:[{id:1,name:aa},{id:2,name:bb},{id:3,name:cc},{id:4,name:dd}],2222:[{id:5,name:ee},{id:6,name:ff},{id:7,name:gg},{id:8,name:hh}]}处理map对map内的每个list进行排序
{1111:[{id:4,name:dd},{id:3,name:cc},{id:2,name:bb},{id:1,name:aa}],2222:[{id:8,name:hh},{id:7,name:gg},{id:6,name:ff},{id:5,name:ee}]}