前言
collect 是一个归约操作,就像 reduce 一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法是通过定义新的Collector 接口来定义的。
一、使用方法
1.规约和汇总
public static void collectTest(){
List<Integer> numbers = Arrays.asList(1,2,3,4,5);
System.out.println(numbers.stream().count());//元素个数
Map<Boolean, List<Integer>> collect = numbers.stream().collect(groupingBy(i -> i % 2 == 0));//以奇偶数分组
System.out.println(collect.get(true));
System.out.println(numbers.stream().collect(maxBy(Comparator.comparingInt(i->i))));//最大值
System.out.println(numbers.stream().collect(summingInt(i->i)));//和
System.out.println(numbers.stream().collect(summarizingInt(i->i)));//一劳永逸,常用汇总数据
System.out.println(numbers.stream().map(i->i+"").collect(joining(",")));//连接字符串,并设置分隔符
}
5
[2, 4]
Optional[5]
15
IntSummaryStatistics{count=5, sum=15, min=1, average=3.000000, max=5}
1,2,3,4,5
2.分组
- 单级分组
按照一个属性对集合中的项目进行分组
实战:按照Dish的type进行分组
public class Dish {
String type;
String name;
int costs;
}
public static void groupTest() {
List<Dish> dishes=Arrays.asList(new Dish("fish","prawns",200),
new Dish("fish","salmon",200),
new Dish("meat","pock",20),
new Dish("meat","beef",30),
new Dish("meat","chicken",400),