[英]Java8 Stream Reduce
谁能解释一下 reduce() 在这段代码中是如何工作的! 我无法理解它在做什么以及结果如何 45 !
代码:-
/*
<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
谢谢和问候萨斯瓦塔曼达尔
这是对reduce()
的不好使用,因为组合器 function 与累加器 function 不兼容。
为了使它们兼容,它们必须满足:
对于所有 u 和 t,必须满足以下条件:
combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
在您的代码中,这将要求:
u + (1 * t) == u * t
这显然不是真的。
此外,您还违反了以下要求
标识值必须是组合器 function 的标识。
1
不是加法的标识。 0
是。
至于你得到的结果:
reduce()
不限于按顺序执行。
如果accumulator
仅用于将标识元素与Stream
的元素相乘,而combiner
用于组合所有部分结果,则您将得到元素的总和,而不是元素的乘积。
当然,当您以这种方式滥用reduce()
方法时,您不能依赖特定的结果。 不同的实现会产生不同的结果。
如果要 reduce 正确计算总和,它应该是:
Integer i = myStream.reduce(0,(a,b) -> (a+b),(a,b) -> (a+b));
如果你想减少正确计算一个产品,它应该是:
Integer i = myStream.reduce(1,(a,b) -> (a*b),(a,b) -> (a*b));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.