容器: boxSupplier(identity),这里包裹用的是一个长度为1的Object[]数组,至于原因自然是不可变类型的锅
加入容器操作: a[0] = op.apply(a[0], t)
多容器合并: a[0] = op.apply(a[0], b[0]); return a;
聚合后的结果操作: 结果自然是Object[0]所包裹的数据a -> a[0]
优化操作状态字段: CH_NOID
public static <T> Collector<T, ?, T> reducing(T identity, BinaryOperator<T> op) { 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);}简单来说这个地方做的事情和 reduce 是一样的 , 第一个 id 传入的就是 reduce 的初始值 , 只是他把它包装成一个 长度为1的数组了 。
//原生操作final Integer[] integers = Lists.newArrayList(1, 2, 3, 4, 5).stream().collect(() -> new Integer[]{0}, (a, x) -> a[0] += x, (a1, a2) -> a1[0] += a2[0]);//reducing操作final Integer collect = Lists.newArrayList(1, 2, 3, 4, 5).stream().collect(Collectors.reducing(0, Integer::sum));//当然Stream也提供了reduce操作final Integer collect = Lists.newArrayList(1, 2, 3, 4, 5).stream().reduce(0, Integer::sum)
【Java 提效神器 Stream 的冷门技巧】
推荐阅读
- javascript10个实用小技巧
- 移动电源|新一代差旅神器!魅族PANDAER 130W可视移动电源开售:999元
- 线上debug诊断神器-Arthas
- Linux下查找java进程耗用cpu最高的线程方法
- JavaScript 中的“提升”是怎么回事?
- Java不停机监控&热操作
- 使用java开发微信公众号系列-公共类
- 浅谈java中重写和重载的区别
- 网络扫描神器Nmap常用操作方法详解以及使用脚本爆破telnet密码
- 详解Java反序列化漏洞
