本文包含了對(duì)于Java8的一些最佳實(shí)踐,包括Stream和Lambda表達(dá)式的一些基礎(chǔ)。
筆者已經(jīng)使用Java8工作許多年,包括新的應(yīng)用開發(fā)以及遷移舊的應(yīng)用,感覺是時(shí)候總結(jié)Java8中一些有用東西的最佳實(shí)踐。筆者個(gè)人不太喜歡“最佳實(shí)踐”這個(gè)詞,因?yàn)樽置嫔蟼鬟_(dá)了一種“one size fit all”的概念,當(dāng)然,編碼肯定不是這樣的而是不同的場(chǎng)景有不同的解決方案。但是筆者覺得在如何使用Java 8讓自己的生活變得更加容易上還是有一些特殊的經(jīng)驗(yàn)值得分享的。
Optional
Optional是一個(gè)評(píng)價(jià)過低的特性,它可以顯著的降低代碼拋出NullPointerException的可能。它在邊界代碼(你正在使用的API或者你發(fā)布的API)中特別有用。
但是對(duì)于它的不適當(dāng)?shù)氖褂煤驮O(shè)計(jì)很容易使一個(gè)小的變動(dòng)影響到很多的類,或者降低代碼的可閱讀性。這里有一些如何更加高效使用Optional的建議。
Optional應(yīng)該僅僅用在返回類型中
不要用在參數(shù)或者域中。 閱讀這篇博文 可以看到如何正確使用Optional進(jìn)行編碼。幸運(yùn)的是,IntelliJ IDEA可以打開inspections去檢查你是否遵循了這些推薦規(guī)范。

要盡早在Optional出現(xiàn)的地方對(duì)它進(jìn)行處理。IntelliJ IDEA會(huì)阻止Optional出現(xiàn)在你代碼的各個(gè)地方,所以記住一定要在Optional出現(xiàn)的地方就對(duì)他進(jìn)行處理。

不能簡(jiǎn)單地調(diào)用get()方法
Optional是用來表示這個(gè)值是有可能為空的,讓你做好應(yīng)對(duì)的準(zhǔn)備。因此,很重要的一點(diǎn)就是在使用這個(gè)值之前務(wù)必要檢查其是否存在。簡(jiǎn)單地調(diào)用get方法而不是先調(diào)用isPresent可能會(huì)導(dǎo)致產(chǎn)生空指針異常。幸運(yùn)的是,IntelliJ IDEA再一次提供了對(duì)此種方案的檢查。

更加優(yōu)雅的方案
如下代碼,isPresent和get當(dāng)然能夠解決這個(gè)問題。

但是這里有更加優(yōu)雅的方式,你可以使用orElse來設(shè)置一個(gè)默認(rèn)值。

或者你可以使用orElseGet來設(shè)置當(dāng)值為null的時(shí)候去調(diào)用的方法。雖然看著和前面的方案沒有什么大的不同。但是提供的方法應(yīng)該僅僅在需要調(diào)用的時(shí)候才被調(diào)用。那么當(dāng)這是個(gè)代價(jià)昂貴的方法時(shí),那么使用lambda會(huì)帶來更好的性能提升。

使用Lambda表達(dá)式
Lambda表達(dá)式是Java8最主要的賣點(diǎn)。即使你現(xiàn)在用不到Java8,你也應(yīng)該對(duì)它有了一些基本的了解。下面講述了一種新的方式使用Java編程,雖然這并不是一個(gè)“最佳實(shí)踐”,僅僅是一個(gè)使用的指導(dǎo)。
保持簡(jiǎn)短
函數(shù)式編程對(duì)于長(zhǎng)的lambda表達(dá)式是歡迎的,但是對(duì)于僅僅使用Java開發(fā)很多年的人發(fā)現(xiàn)編寫短的lambda表達(dá)式會(huì)更容易一些。你甚至?xí)氚驯磉_(dá)式縮減到一行,也很容易把長(zhǎng)的表達(dá)式重構(gòu)成一個(gè)方法。

當(dāng)然,這些甚至牽扯到了方法引用(Method References)。方法引用可能看著有點(diǎn)陌生,但是由于其能讓代碼達(dá)到更好的閱讀性,還是有很大應(yīng)用價(jià)值的。后面,我會(huì)講到這個(gè)概念。

顯式聲明
在lambda表達(dá)式中是沒有類型信息的,所以你會(huì)發(fā)現(xiàn)在參數(shù)中包含類型信息是非常有用的。

如你所見,這會(huì)變得很笨重。所以我更喜歡賦予參數(shù)有意義的名字。當(dāng)然,無論你是否這么做,IntelljJ IDEA都會(huì)讓你可以看到參數(shù)的類型信息。