谁能解释一下reduce()在这段代码中是如何工作的!!我无法理解它在做什么,结果如何!!
代码:-
/*
<U> U = Stream<T>.reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
* /
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Stream;
import java.util.Optional;
public class StreamDemo4
{
public static void main(String args[])
{
ArrayList<Integer> myList = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));
System.out.println("List = "+myList);
Stream<Integer> myStream = myList.parallelStream();
System.out.print("Result = ");
Integer i = myStream.reduce(1,(a,b) -> (a*b),(a,b) -> (a+b));
System.out.println(i.intValue());
}
}
OUTPUT :-
List = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Result = 45
感谢并问候saswata mandal
1条答案
按热度按时间hgb9j2n61#
这是一个坏习惯
reduce()
,因为合并器函数与累加器函数不兼容。为了使它们兼容,它们必须满足:
对于所有u和t,必须满足以下条件:
combiner.apply(u,累加器.apply(identity,t))==累加器.apply(u,t)
在您的代码中,这需要:
这显然不是真的。
此外,您还违反了
标识值必须是组合器函数的标识。
1
不是添加的标识。0
是。至于你得到的结果:
reduce()
不受顺序执行的约束。如果
accumulator
仅用于将标识元素乘以Stream
,和combiner
用于合并所有部分结果,您将得到元素的和,而不是元素的乘积。当然,当你滥用规则时,你不能依赖于一个特定的结果
reduce()
方法是这样的。不同的实现可以产生不同的结果。如果您希望reduce正确计算一个和,它应该是:
如果您希望reduce正确计算乘积,则应为: