[Java8新特性]Collectors源码阅读-2 reducing,maxBy,summingInt等

本文详细解析了Java8中Collectors的reducing方法的三个重载形式,以及如何利用reducing实现counting、maxBy、minBy、summingInt等统计方法。通过对源码的分析,阐述了这些方法的工作原理和实现细节。
摘要由CSDN通过智能技术生成

上节介绍了将流转成集合的方法(toCollections)和将元素转换成拼接字符串(joining)的方法,本节介绍几个求统计数值的方法,分别是

  1. counting
  2. maxBy
  3. minBy
  4. summingInt/summingLong/summingDouble
  5. averagingInt/averagingLong/averagingDouble
  6. reducing

前三个都是借助reducing方法来实现的,后面的两个方法的实现思路和reducing很像,所以这节先介绍reducing铺垫一下

1.reducing

reducing方法可以将流中的元素进行累加,运算到第n个元素的时候,将前n-1个元素运算的中间结果和第n个元素进行运算,这个方法有三个重载

1.1reducing(T identity, BinaryOperator op)

这个方法接受两个参数,一个是初始值,如果流中的元素都没有的时候就会返回这个identity,另一个参数是BinaryOperator,这个是指定具体做什么运算
比如下面这个reduce的用法可以计算流中所有元素的总和

int total = IntStream.range(0, 10).reduce(0, Integer::sum);

返回的类型是Collector<T, ?, T>,即流中的元素和最终输出的元素是同一个类型T,中间容器的类型可以是任意
这个方法的源码是:
具体实现是:

return new CollectorImpl<>(
                boxSupplier(identity),
                (a, t) -> {
    a[0] = op.apply(a[0], t); },
                (a, b) -> {
    a[0] = op.apply(a[0], b[0]); return a; },
                a -> a[0],
                CH_NOID);

可以看到,它借助了一个长度为1的数组来作为中间的结果容器,这个的方法boxSupplier其实是提供这个数组,它的实现是:

private static <T> Supplier<T[]> boxSupplier(T identity) {
   
        return () -> (T[]) new Object[] {
    identity };
    }

只是提供了一个类型为T的长度为1的数组,数组里面的元素是identity,也就是传入的第一个参数,这个collector具体的组成是

supplier accumulator combiner finisher characteristic
boxSupplier(identity) (a, t) -> { a[0] = op.apply(a[0], t); }, (a, b) -> { a[0] = op.apply(a[0], b[0]); return a; } a -> a[0] CH_NOID
长度为1,类型为T,初始值为identity的数组 是将当前的元素T和中间结果a[0]进行运算之后再重新赋值到a[0] 对于两个结果装着中间结果的数组,将他们的值进行
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值