簡體   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