java8流还原

pes8fvy9  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(426)

谁能解释一下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

hgb9j2n6

hgb9j2n61#

这是一个坏习惯 reduce() ,因为合并器函数与累加器函数不兼容。
为了使它们兼容,它们必须满足:
对于所有u和t,必须满足以下条件:
combiner.apply(u,累加器.apply(identity,t))==累加器.apply(u,t)
在您的代码中,这需要:

u + (1 * t) == u * t

这显然不是真的。
此外,您还违反了
标识值必须是组合器函数的标识。 1 不是添加的标识。 0 是。
至于你得到的结果: reduce() 不受顺序执行的约束。
如果 accumulator 仅用于将标识元素乘以 Stream ,和 combiner 用于合并所有部分结果,您将得到元素的和,而不是元素的乘积。
当然,当你滥用规则时,你不能依赖于一个特定的结果 reduce() 方法是这样的。不同的实现可以产生不同的结果。
如果您希望reduce正确计算一个和,它应该是:

Integer i = myStream.reduce(0,(a,b) -> (a+b),(a,b) -> (a+b));

如果您希望reduce正确计算乘积,则应为:

Integer i = myStream.reduce(1,(a,b) -> (a*b),(a,b) -> (a*b));

相关问题