2017-04-12 49 views
0

我做了一些PoC來比較兩種類型的實現交互列表的性能。項目開發中所需的Lambda

第一個人使用純java使用foreach並檢查'if'每個元素。

第二種方法是使用lambda這樣的:

int max1 = lists1.stream() 
        .mapToInt(i -> i) 
        .max() 
        .getAsInt(); 

long finalCount = lists1.stream() 
         .filter(p -> p.intValue() == max1) 
         .count(); 

顯然使用lambda爲5的時間比使用傳統的Java foreach更快。

我感覺非常有信心在我目前的項目中強制使用lambda作爲規則,禁止使用經典的java foreach

我的問題是,如果有,我可以不適用此規則(需要拉姆達),我的意思是,如果存在例外,我無法使用lambda使用集合一些場景。

+5

不要。這個微型基準不會「證明」任何東西。 –

+1

並不是一切都是關於表現,你錯過了這一點。 –

+3

這是一個意見問題。您的測試存在缺陷。所有流都比傳統循環更快並不明顯。 –

回答

2

絕對的第一件事 - 基準Java代碼是complicated。 含義:除非您確實已遵循之前鏈接中列出的規則,否則您的衡量結果很可能是虛假的。

除此之外:lambdas確實使用invokedynamic字節碼指令,這反過來又可以提高性能。

但是,這並不能支持爲整個團隊強制執行這樣的政策。

真正的答案是:讓您的團隊瞭解溪流和lambda的優缺點。使他們能夠在何時以及如何利用這些概念時做出明智的決定。確保人們瞭解他們正在做什麼,而不是給他們一個清單,遵循命令。

6

Lambda +流顯然更快?並非如此。

這很大程度上取決於情況,但總的來說,Java 7循環比流更快,因爲發生的次數較少。

回答你的問題:「否」;你不應該要求lambda總是被使用,因爲:

  • 這是一種風格的東西;這兩種形式都是可以接受的,當實現爲流
  • 你的理由是毫無根據
  • 可讀性幾乎總是勝過「性能」

對於並行流處理可以更快

  • 有些循環變成火車殘骸,但只有當流足夠大才能證明管理流的開銷。作爲一個經驗法則,如果您至少有1000個要處理的元素,請嘗試一個流。