1. 收集器简介
收集器用来将经过筛选、映射的流进行最后的整理,可以使得最后的结果以不同的形式展现。
collect方法即为收集器,它接收Collector接口的实现作为具体收集器的收集方法。
Collector接口提供了很多默认实现的方法,我们可以直接使用它们格式化流的结果;也可以自定义Collector接口的实现,从而定制自己的收集器。
这里先介绍Collector常用默认静态方法的使用,自定义收集器会在下一篇博文中介绍。
2. 收集器的使用
2.1 归约
流由一个个元素组成,归约就是将一个个元素“折叠”成一个值,如求和、求最值、求平均值都是归约操作。
2.1.1 计数
long count = list.stream()
.collect(Collectors.counting());
也可以不使用收集器的计数函数:
long count = list.stream().count();
注意:计数的结果一定是long类型。
2.1.2 最值
例:找出所有人中年龄最大的人
Optional<Person> oldPerson = list.stream()
.collect(Collectors.maxBy(Comparator.comparingInt(Person::getAge)));
计算最值需要使用Collector.maxBy和Collector.minBy,这两个函数需要传入一个比较器Comparator.comparingInt,这个比较器又要接收需要比较的字段。
这个收集器将会返回一个Optional类型的值。
Optional类简介请移步至:Java8新特性——StreamAPI(一)
2.1.3 求和
例:计算所有人的年龄总和
int summing = list.stream()
.collect(Collectors.summingInt(Person: