前言
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值对整个结果不产生影响。
网友评论