繁体   English   中英

Java8 Stream 减少

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM