該如何使用? 什么是 Lambda?( 二 )



靜態函數里面的for each循環其實是非常礙眼的 。 這里可以利用Iterable自帶的forEach()來替代 。 forEach()本身可以接受一個Consumer參數 。
第二步簡化 - 用Iterable.forEach()取代foreach loop:

該如何使用? 什么是 Lambda?

文章插圖

由于靜態函數其實只是對List進行了一通操作,這里我們可以甩掉靜態函數,直接使用stream()特性來完成 。 stream()的幾個方法都是接受Predicate,Consumer等參數的(java.util.stream (Java Platform SE 8 )) 。 你理解了上面的內容,stream()這里就非常好理解了,并不需要多做解釋 。
第三步簡化 - 利用stream()替代靜態函數:
該如何使用? 什么是 Lambda?

文章插圖

對比最開始的Lambda寫法,這里已經非常非常簡潔了 。 但是如果,我們要求變一下,變成print這個人的全部信息,及p -> System.out.println(p); 那么還可以利用Method reference來繼續簡化 。 所謂Method reference, 就是用已經寫好的別的Object/Class的method來代替Lambda expression 。 格式如下:
該如何使用? 什么是 Lambda?

文章插圖

第四步簡化 - 如果是println(p),則可以利用Method reference代替forEach中的Lambda表達式:
該如何使用? 什么是 Lambda?

文章插圖

這基本上就是能寫的最簡潔的版本了 。
Lambda配合Optional可以使Java對于null的處理變的異常優雅
這里假設我們有一個person object,以及一個person object的Optional wrapper:
該如何使用? 什么是 Lambda?

文章插圖

Optional如果不結合Lambda使用的話,并不能使原來繁瑣的null check變的簡單 。
該如何使用? 什么是 Lambda?

文章插圖

只有當Optional結合Lambda一起使用的時候,才能發揮出其真正的威力!
我們現在就來對比一下下面四種常見的null處理中,Java 8的Lambda+Optional和傳統Java兩者之間對于null的處理差異 。
情況一 - 存在則開干
該如何使用? 什么是 Lambda?

文章插圖

情況二 - 存在則返回,無則返回屁
該如何使用? 什么是 Lambda?

文章插圖

情況三 - 存在則返回,無則由函數產生
該如何使用? 什么是 Lambda?

文章插圖

情況四 - 奪命連環null檢查
該如何使用? 什么是 Lambda?

文章插圖

由上述四種情況可以清楚地看到,Optional+Lambda可以讓我們少寫很多ifElse塊 。 尤其是對于情況四那種奪命連環null檢查,傳統java的寫法顯得冗長難懂,而新的Optional+Lambda則清新脫俗,清楚簡潔 。
關于Java的Lambda, 還有東西需要討論和學習 。 比如如何handle lambda exception,如何利用Lambda的特性來進行parallel processing等 。
3.總結
【該如何使用? 什么是 Lambda?】 想要深入的了解Lambda,辦法只有一個:動手實踐起來,實踐是精通一項技術的第一步,來把,現在就開始 coding 吧 。

推薦閱讀