
甚至lambda表示的函數(shù)接口也能看到。

設(shè)計Lambda表達(dá)式
我認(rèn)為lambda表達(dá)式有一點類似于泛型-我們會經(jīng)常使用到泛型(例如,添加類型信息到List<>),但是比較罕見的是我們?nèi)ピO(shè)計一個具有泛型的方法或者一個類(比如像Person\)。同樣的,我們經(jīng)常會在使用諸如Streams API的時候傳遞lambda,但是卻很少會創(chuàng)建一個需要傳遞lambda參數(shù)的方法。
如果你發(fā)現(xiàn)自己處在這樣一種境況,那么這里有一些提示。
IntelliJ IDEA能夠幫助你引入函數(shù)參數(shù)
能夠讓你創(chuàng)建一個參數(shù),這個參數(shù)是一個lambda而不是一個Object。這個特性的最好的一點就是它會智能建議一個匹配規(guī)格的已存在的函數(shù)接口。

使用存在的函數(shù)接口
隨著開發(fā)者變得對Java8越來越熟悉,當(dāng)使用Supplier和Consumer這些接口時,我們將會知道什么是我們所期望的,比如創(chuàng)建一個ErrorMessageCreator(例子)會是令人迷惑和浪費的??梢钥匆幌?函數(shù)包 獲取已經(jīng)存在的那些函數(shù)接口。
[email protected]
如果你確實需要創(chuàng)建自己的函數(shù)接口,那么用這個注解去標(biāo)記它。看起來不需要這么做,但是Inteelij IDEA會在你的函數(shù)接口沒有符合規(guī)范時提示你。當(dāng)沒有方法實現(xiàn)這個接口時,它會提示你。

當(dāng)方法太多時,也會提示你。

當(dāng)你把注解應(yīng)用到一個類而不是接口時,也會發(fā)出提醒。

Lambda表達(dá)式可以被用在任何有一個Single Abstract Method的接口中,但是它不能夠應(yīng)用到一個抽象類中??雌饋頉]有啥邏輯,但它就是這樣的。
Streams
Stream API 是Java8另一個最大的賣點,我認(rèn)為我們到現(xiàn)在還是沒有真的搞清楚這會如何改變我們的代碼。這里有一些我自己發(fā)現(xiàn)很有用的東西。
將點號對齊
我個人比較喜歡對齊Stream操作。當(dāng)然,你不需要非得這么做,但是我發(fā)現(xiàn)這樣還是有很大好處的。
一眼就看到所有的操作以及他們的順序
更容易調(diào)試(雖然Intellij IDEA提供了在一行中的lambda表達(dá)式中任意地方打斷點的功能,但是將他們分隔成單獨的行會更簡單)
可以很容易地注釋掉一些操作以供測試
很容易地插入peek()供調(diào)試或者測試

這樣做也會讓代碼看起來很舒服。當(dāng)然,如果這么做,會增加代碼的行數(shù)。
你可以修改一下格式化設(shè)置使點號對齊。

使用方法引用(Method References)
你可能需要一會兒才能習(xí)慣這個奇怪的語法。但是,當(dāng)我們能夠正確地使用,它確實能夠提高程序的可閱讀性??紤]下面的代碼:

對比一下使用新引入的Objects類的輔助方法(helper methods):

后面的代碼能夠更加明顯地表明它想保存的值。IntelliJ IDEA會提示你何時一個lambda可以被替換成方法引用。
當(dāng)?shù)粋€集合,盡可能地使用Streams API
使用新的集合方法:forEach。IDEA會提示你。