jdk8-31-工厂方法收集器Collectors的中的常用函数

1 collectorImpl

  • Collectors 中的 的基础 collectorImpl 两个构造方法一个有 finisher(), 一个没有。这个很容易理解,一个需要转换中间结果,一个中间结果和最终结果一致,所以不需要使用 finisher() 方法

2 两种实现方式

对于工厂类 两种实现方式

  1. CollectorImpl 来实现。
  2. reduceing 来实现, 而 reducing 方法归根还是用的是 CollectorImpl 方法来实现

3 常见函数

1) toList() & toCollection

  • 两个最常用的方法 toList() & toCollection

  • toSet() 方法是也是 toCollection 的特化。

2) joining()

  • joining 三种重载方法

3) mapping()

  • mapping() 将输入元素转换成输出元素
1
2
3
4
Map<City, Set<String>> lastNamesByCity= people.stream().collect(groupingBy(
Person::getCity,
mapping(Person::getLastName, toSet()) // Mapping , 将Person 转换成String , 提供给下游 Collector 使用
));

4) collectingAndThen()

  • collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher) 先过完上层收集器 downstream ,在进行一次 finisher() 转换结果

    比如说,你在 toList() 之后,想将它转换成一个 immutableList() 就可以如下使用

List<String> people = people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));

实现其实很有意思

5) counting() , minBy() , maxBy()

  • counting() , minBy() , maxBy()reducing() 实现, reducing() 又是基于 CollectorImpl 实现

6) summingInt() , averagingInt() , averagingDouble()

  • summingInt() 对每一个元素使用 toIntFunction 在累加,实现很有意思

Supplier() 采用生成了一个 长度为1 的 int 数组,而不是直接使用的整形数字?
因为数字是一个 , 值是无法传递的,而数组是一个 引用, 引用是可以传递的。

  • averagingInt() 求平均值

  • 对于averagingDouble() 的实现可以再去看一下,他的初始数组长度为4,他们视为浮点数计算的补偿产生的。
朱老师&敏哥 wechat
有惊喜,朋友🙄
我要拿铁不加糖.