2017-08-01 34 views
1

這一行函數式編程代碼如下: 2 * 3 + 4 * 3 + 6 * 3 + 8 * 3 + 10 * 3操作。瞭解Java 8/9函數式編程中的Map和Reduce(lambda表達式)。 map()和reduce()如何提高性能?

int sum = IntStream.rangeClosed(1,10) /* closed range */ 
      .filter(x -> x%2 == 0) /* filter to even numbers in range */ 
      .map(x -> x*3) /* map */ 
      .sum(); /* actual sum operation happens */ 
      System.out.println(sum); /* prints 90 */ 

我明白它在做什麼。我想知道在內存分配方面發生了什麼?我們可以有以下類似的舊操作替代方法。這很容易理解,但基於Lambda的代碼更具表現力。

int sum=0; 
for(int i=1; i<=10;i++) { 
    if(i%2 == 0) { 
     sum=sum+i*3; 
     } 
    } 
System.out.println(sum); /* prints 90 */ 
+2

FYI:我刪除了'Java的9'標籤,因爲您使用流API是不特定於Java 9.我接着說:java'。 – Nicolai

+0

感謝您的努力。 –

回答

5

首先lambda expressions將被取消加糖到你的類文件中的靜態方法(使用javap看到)。

對於Predicate會有一個.class生成(您可以通過-Djdk.internal.lambda.dumpProxyClasses=/Your/Path參數集看,當你調用你的類。

同樣的事情會發生在Functionmap操作。

由於您的lambda表達式是stateless會有Predicate和創建和重新用於每個操作Function的單個實例。如果它本來有狀態的λ。 - 用於將被處理的每個元素可以產生一個新的實例

而且從你的問題標題mapreduce不提高性能(除非有噸的元素,你可以用一個好處並行化處理)。您簡單的循環會更快 - 但不是比流快得多。您還選擇了一個非常簡單的例子 - 假設你選擇做一些繁重的grouping,然後自定義collection,等一個例子 - 通過stream簡單的方法的詳細程度是顯著。