- 分组操作:Collectors.groupingBy()
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
list.add(new TestVO(1,"李小明",18));
list.add(new TestVO(2,"李小明",19));
list.add(new TestVO(3,"王大朋",16));
list.add(new TestVO(4,"陈小跑",10));
// 分组并求count(counting方法返回所收集元素的总数)
Map<Integer, Long> sexCount = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.counting()));
// 分组并求sum(summing方法会对元素求和)
Map<Integer, Integer> ageCount = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.summingInt(TestVO::getAge)));
// 分组并求最大、最小值 (maxBy和minBy会接受一个比较器,求最大值,最小值)
Map<Integer, Optional<User>> ageMax = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.maxBy(Comparator.comparing(TestVO::getAge))));
// 如果想一次操作直接完成求和、求count、求最大、求最小也可以(Collectors.summarizing(Int/Long/Double)就是为你准备的,它可以一次行获取前面的所有结果,其返回值为(Int/Long/Double)SummaryStatistics)
DoubleSummaryStatistics dss = list.stream().collect(Collectors.summarizingDouble((TestVOp)->p.age));
double average=dss.getAverage();
double max=dss.getMax();
double min=dss.getMin();
double sum=dss.getSum();
double count=dss.getCount();
// 分组并取只取对象中某一个元素集合(mapping函数会应用到downstream结果上,并需要和其他函数配合使用)
Map<Integer, List<String>> nameMap = list.stream().collect(Collectors.groupingBy(TestVO::getName,Collectors.mapping(TestVO::getName,Collectors.toList())));
- 转Map操作:Collectors.toMap()
// 测试数据,请不要纠结数据的严谨性
List<TestVO> list = new ArrayList<>();
list.add(new TestVO(1,"李小明",18));
list.add(new TestVO(2,"李小明",19));
list.add(new TestVO(3,"王大朋",16));
list.add(new TestVO(4,"陈小跑",10));
// 转map
Map<Integer, Long> sexCount = list.stream().collect(Collectors.toMap(TestVO::getName,TestVO::getAge, (v1, v2) -> v1));
// 转value为对象的map
Map<Integer, Long> sexCount = list.stream().collect(Collectors.toMap(TestVO::getName,testVO -> testVO, (v1, v2) -> v1));
// 在转换成List
List<Param> paramList = map.keySet().stream()
.map(key -> {
Param param= new Param();
param.setCmd(key);
param.setParam(idAndAgeMap .get(key));
return param;
})
.collect(Collectors.toList());
3.一些常见的就不总结了之前文章中总结过。
|