中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java 8的五大開(kāi)發(fā)技巧

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

  我使用Java 8編碼已經(jīng)有些年頭,既用于新的應(yīng)用程序,也用來(lái)遷移現(xiàn)有的應(yīng)用,感覺(jué)是時(shí)候?qū)懸恍┪野l(fā)現(xiàn)的非常有用的“最佳實(shí)踐”。我個(gè)人并不喜歡“最佳實(shí)踐”這個(gè)說(shuō)法,因?yàn)樗馕吨?ldquo;一刀切”的解決方案,而編碼不可能是這樣的工作方式——我們需要親自去發(fā)現(xiàn)什么樣的解決方案才是有效的。但是我發(fā)現(xiàn)了一些Java 8代碼中可以幫助我們的一些選擇,讓我們一起來(lái)看看吧。

 1.Optional

  Optional是一個(gè)嚴(yán)重被低估的功能,并且有潛力刪除很多困擾我們的NullPointerExceptions。這在代碼邊界中(要么是正在使用的API,要么是正在暴露的API)特別有用,因?yàn)樗试S你和你的調(diào)用代碼來(lái)推理所期待的東西。

  然而,不加思考和設(shè)計(jì)就應(yīng)用Optional可能會(huì)導(dǎo)致影響大量的類(lèi),并可能導(dǎo)致可讀性更差。下面是一些關(guān)于如何高效使用Optional的技巧。

  Optional應(yīng)該只用于返回類(lèi)型

  ……不是參數(shù),也不是字段。幸運(yùn)的是,IntelliJ IDEA的讓你打開(kāi)檢查來(lái)查看是是否遵循這些建議。

  Optional值應(yīng)在遇到它們的地方中處理。IntelliJ IDEA的建議會(huì)防止代碼Optional泄漏,所以請(qǐng)記得在你發(fā)現(xiàn)Optional的地方處理它,迅速采取行動(dòng)。

  不應(yīng)該簡(jiǎn)單調(diào)用get()

  Optional的功能是表達(dá)這個(gè)值可能是空的,并讓你應(yīng)對(duì)這種情況。因此,在對(duì)它做任何事情之前一定要檢查是否有一個(gè)值。只是簡(jiǎn)單得調(diào)用get()而不先檢查isPresent()在某些時(shí)候可能會(huì)導(dǎo)致空指針。幸運(yùn)的是,IntelliJ IDEA也有檢查可以提醒你這一點(diǎn)。

  可能有更優(yōu)雅的方式

  結(jié)合了get()的isPresent()當(dāng)然會(huì)很贊…

  ……但也有更優(yōu)雅的解決方案。你可以使用orElse在萬(wàn)一是空值的情況下給一個(gè)替代方案。

  ……或者你可以使用orElseGet說(shuō)明在值為空的情況下調(diào)用哪個(gè)方法。這似乎與上面的例子相同,但supplier方法將只在需要的時(shí)候調(diào)用,因此,如果這是一種昂貴的方法,那么使用lambda會(huì)有更佳性能。

 2.使用Lambda表達(dá)式

  Lambda表達(dá)式是Java 8的主要特點(diǎn)之一。即使你還沒(méi)有使用Java 8,你現(xiàn)在可能已經(jīng)對(duì)它們有了基本的了解。它們是用Java編程的一種新的方式,并且什么是“最佳實(shí)踐”還不明顯。下面是我喜歡遵循的一些指引。

  保持簡(jiǎn)短

  函數(shù)式程序員與較長(zhǎng)的lambda表達(dá)式相處會(huì)更愉快,但那些淫浸于Java多年的人會(huì)發(fā)現(xiàn)保持lambda表達(dá)式為區(qū)區(qū)幾行代碼更容易。你甚至可能更愿意將其限制到一行代碼,并且你可以輕松重構(gòu)較長(zhǎng)的表達(dá)式為一個(gè)方法。

  這些甚至可能會(huì)成為方法引用。方法引用一開(kāi)始會(huì)覺(jué)得有點(diǎn)陌生,但實(shí)際上堅(jiān)持方法引用是有價(jià)值的,因?yàn)樗鼈冊(cè)谀承┣闆r下有助于可讀性,后面我會(huì)討論到這一點(diǎn)。

  明確

  類(lèi)型信息缺少lambda表達(dá)式,所以你可能會(huì)覺(jué)得包含類(lèi)型信息用于參數(shù)會(huì)很有用。

  正如你所見(jiàn),這回變得相當(dāng)笨拙。所以我更喜歡給參數(shù)取一個(gè)有用的名字。當(dāng)然,不管你有沒(méi)有這么做,IntelliJ IDEA可以讓你看到參數(shù)得類(lèi)型信息。

  甚至是lambda所代表的函數(shù)式接口:

 3.針對(duì)Lambda表達(dá)式設(shè)計(jì)

  我認(rèn)為lambda表達(dá)式有點(diǎn)像泛型——和泛型一起,我們經(jīng)常使用它們(例如,添加類(lèi)型信息到List<>),但最好我們可以設(shè)計(jì)一種方法或一個(gè)具有泛型類(lèi)型(例如Person<T>)的類(lèi)。同樣的,當(dāng)使用類(lèi)似于Streams API的東西時(shí),我們會(huì)傳遞lambda表達(dá)式,但更好的是創(chuàng)造一個(gè)需要lambda參數(shù)的方法。

  但是,如果你發(fā)現(xiàn)自己處于這類(lèi)情況下,下面有一些超棒的技巧。

  IntelliJ IDEA可以幫你引進(jìn)函數(shù)式參數(shù)

  這讓你可以在有人將傳遞一個(gè)lambda而非Object的地方創(chuàng)建一個(gè)參數(shù)。此功能的好處是,它表明,現(xiàn)有函數(shù)式接口匹配規(guī)格說(shuō)明。

  這會(huì)導(dǎo)致…

  使用現(xiàn)有的函數(shù)式接口

  隨著開(kāi)發(fā)人員越來(lái)越熟悉Java 8代碼,我們就能知道當(dāng)使用如Supplier和 Consumer的接口時(shí),會(huì)發(fā)生什么,以及創(chuàng)建一個(gè)本地的ErrorMessageCreator(舉個(gè)例子)可能會(huì)造成混亂,而且浪費(fèi)?纯催@個(gè)函數(shù)包了解一下哪些已經(jīng)是可用的。

  添加@FunctionalInterface到函數(shù)式接口

  如果你確實(shí)需要?jiǎng)?chuàng)建自己的函數(shù)式接口,那么就這樣用此注釋標(biāo)記。這似乎沒(méi)有太大的作用,但I(xiàn)ntelliJ IDEA會(huì)告訴你,在你的接口不能匹配用于函數(shù)式接口的異常的時(shí)候。當(dāng)你沒(méi)有指定要覆蓋的方法時(shí),它會(huì)標(biāo)志:

  當(dāng)你指定了太多方法的時(shí)候,它會(huì)標(biāo)志:

  并且如果你應(yīng)用它到一個(gè)類(lèi)而不是接口時(shí),它會(huì)警告你:

  lambda表達(dá)式可用于帶有一個(gè)單一抽象方法的任何接口,但它們不能用于符合相同標(biāo)準(zhǔn)的抽象類(lèi)。似乎不合邏輯,但就是這樣。

 4.Stream

  Stream API是Java 8另一個(gè)大特點(diǎn),并且我認(rèn)為我們還真的不知道這對(duì)我們的編碼方式會(huì)產(chǎn)生多大的改變。下面是我發(fā)現(xiàn)的一些有用的東西。

  排隊(duì)點(diǎn)操作符

  我個(gè)人更喜歡排隊(duì)我的流操作。當(dāng)然,你沒(méi)有必要這樣,當(dāng)我發(fā)現(xiàn)這樣做對(duì)我有幫助:

  • 一目了然地看到我有哪些操作
  • 調(diào)試更容易(雖然IntelliJ IDEA確實(shí)提供了對(duì)一行中的任意多個(gè)lambda表達(dá)式設(shè)置斷點(diǎn)的能力,但是拆分到不同的行會(huì)變得更簡(jiǎn)單)
  • 當(dāng)我測(cè)試東西的時(shí)候注釋操作
  • 輕松插入peek()用于調(diào)試或測(cè)試

  此外,在我看來(lái),它更整潔。如果我們按照這個(gè)模式,在減少代碼行數(shù)方面我們并沒(méi)有增加很多。

  你可能需要調(diào)整格式設(shè)置以排列點(diǎn)操作符。

  使用方法引用

  是的,確實(shí)需要一段時(shí)間來(lái)適應(yīng)這個(gè)奇怪的語(yǔ)法。但是,如果使用得當(dāng),它確實(shí)可以增加可讀性。請(qǐng)看:

  與(相對(duì))新的Objects類(lèi)上的輔助方法相比較:

  后者的代碼對(duì)于哪些值是要保存的更加明確。當(dāng)lambda可以被折疊到方法參考的時(shí)候,IntelliJ IDEA通常會(huì)讓你知道。

  當(dāng)遍歷一個(gè)集合時(shí),在可行的情況下使用Streams API

  …或者新的集合方法,如forEach。IntelliJ IDEA給你建議是:

  一般使用Streams API比循環(huán)和if語(yǔ)句的組合更加明確。例如:

  IntelliJ IDEA建議這可重構(gòu)為:

  我所做的性能測(cè)試表明這種重構(gòu)令人驚訝——并不總是可預(yù)測(cè)性能是保持不變,改善還是變得更糟。與往常一樣,如果性能在應(yīng)用程序中是關(guān)鍵,那么在交付一種風(fēng)格到另一種之前衡量它。

  遍歷數(shù)組時(shí)使用循環(huán)

  但是,使用Java 8并不一定意味著你必須到處使用流和新的集合方法。IntelliJ IDEA會(huì)建議轉(zhuǎn)換成流,但是,這并不意味著你必須回答“yes”(記得檢查是可以抑制或關(guān)閉的)。

  特別是,遍歷原始類(lèi)型的小型數(shù)組幾乎肯定會(huì)用,以獲得更好的性能循環(huán),很可能(至少對(duì)于Java開(kāi)發(fā)人員是新的流)更具可讀性。

  與任何技巧一樣,規(guī)則并不是一成不變的,但你應(yīng)該決定是盡可能地使用Streams API,還是依然對(duì)一些操作使用循環(huán)?傊,要一致。

 最后

  每天都在發(fā)現(xiàn)新的東西,并且有時(shí)候我的偏好會(huì)發(fā)生變化——例如,方法引用,我曾經(jīng)深?lèi)和唇^并且避免在我的代碼中使用,F(xiàn)在我很想聽(tīng)聽(tīng)你的秘訣!

  英文原文:Java 8 Top Tips

標(biāo)簽: isp 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:為什么開(kāi)發(fā)與測(cè)試?yán)掀苣?/a>

下一篇:Python 超詳細(xì)的入門(mén)教程