Stream reduce

2020-12-16  本文已影响0人  黑曼巴yk

前言

reduce是对Stream元素进行聚合求值,最常见的就是讲Stream的一连串的合成为单个值。
reduce方法有三个重载方法

Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity,
                 BiFunction<U, ? super T, U> accumulator,
                 BinaryOperator<U> combiner);

第一个接受BinaryOperator的lambada表达式

List<Integer> numList = Arrays.asList(1,2,3,4,5);
Optional<Integer> result = numList.stream().reduce((a,b) -> a + b );

返回的是Optional类型的数据。

第二个签名实现和第一个唯一的区别是它首次执行的时候,表达式第一个参数并不是Stream的第一个元素,而是通过签名的第一个参数identity.

List<Integer> numList = Arrays.asList(1,2,3,4,5);
Integer result = numList.stream().reduce(100, (a,b) -> a + b );

第三个参数比较复杂,由于前面两种实现有个缺陷,计算结果必须和stream的元素类型相同,如上面代码:stream 中类型为int,那么计算结果必须为int。导致灵活性不足。

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);
        String result = numList.stream().reduce("__", (a, b) -> a += String.valueOf(b), (x, t) -> null);

其实第三个参数用在并行流中才会执行,所以在非并行流中返回null值对整个结果不产生影响。

上一篇下一篇

猜你喜欢

热点阅读