你還在Java8中使用循環(huán)語(yǔ)句嗎?

Java 8中的新功能特性改變了游戲規(guī)則。對(duì)Java開(kāi)發(fā)者來(lái)說(shuō)這是一個(gè)全新的世界,并且是時(shí)候去適應(yīng)它了。

在這篇文章里,我們將會(huì)去了解傳統(tǒng)循環(huán)的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允許我們?nèi)ケ磉_(dá)我們想要完成什么,而不是要怎樣做。這正是循環(huán)的不足之處。要確保循環(huán)的靈活性是需要付出代價(jià)的。return、break 或者 continue都會(huì)顯著地改變循環(huán)的實(shí)際表現(xiàn)。這迫使我們不僅要清楚我們要實(shí)現(xiàn)怎樣的代碼,還要了解循環(huán)是怎樣工作的。

現(xiàn)在我們看看怎樣把這些循環(huán)轉(zhuǎn)換為更簡(jiǎn)潔,可讀性更高的代碼。

代碼轉(zhuǎn)換

好吧,講的夠多了,是時(shí)候展示一些例子了!

這次我們要以文章為例子。一篇文章?lián)碛幸粋€(gè)標(biāo)題,一個(gè)作者和幾個(gè)標(biāo)簽。

private?class?Article?{

????private?final?String?title;

????private?final?String?author;

????private?final?List?tags;

????private?Article(String?title,?String?author,?List?tags)?{

????????this.title?=?title;

????????this.author?=?author;

????????this.tags?=?tags;

????}

????public?String?getTitle()?{

????????return?title;

????}

????public?String?getAuthor()?{

????????return?author;

????}

????public?List?getTags()?{

????????return?tags;

????}

}

每個(gè)例子都會(huì)包含一個(gè)使用傳統(tǒng)循環(huán)的方案和一個(gè)使用Java 8新特性的方案。

在第一個(gè)例子里,我們要在集合中查找包含“Java”標(biāo)簽的第一篇文章。

看一下使用for循環(huán)的解決方案。

public?Article?getFirstJavaArticle()?{

????for?(Article?article?:?articles)?{

????????if?(article.getTags().contains("Java"))?{

????????????return?article;

????????}

????}

????return?null;

}

現(xiàn)在我們使用Stream API的相關(guān)操作來(lái)解決這個(gè)問(wèn)題。

public?Optional?getFirstJavaArticle()?{??

return?articles.stream()

????.filter(article?->?article.getTags().contains("Java"))

????.findFirst();

}

是不是很酷?我們首先使用 filter 操作去找到所有包含Java標(biāo)簽的文章,然后使用 findFirst() 操作去獲取第一次出現(xiàn)的文章。因?yàn)镾tream是“延遲計(jì)算”(lazy)的并且filter返回一個(gè)流對(duì)象,所以這個(gè)方法僅在找到第一個(gè)匹配元素時(shí)才會(huì)處理元素。

現(xiàn)在,讓我們獲取所有匹配的元素而不是僅獲取第一個(gè)。

首先使用for循環(huán)方案。

public?List?getAllJavaArticles()?{

????List?result?=?new?ArrayList<>();

????for?(Article?article?:?articles)?{

????????if?(article.getTags().contains("Java"))?{

????????????result.add(article);

????????}

????}

????return?result;

}

使用Stream操作的方案。

public?List?getAllJavaArticles()?{??

????return?articles.stream()

????????.filter(article?->?article.getTags().contains("Java"))

????????.collect(Collectors.toList());

????}

在這個(gè)例子里我們使用 collection 操作在返回流上執(zhí)行少量代碼而不是手動(dòng)聲明一個(gè)集合并顯式地添加匹配的文章到集合里。

到目前為止還不錯(cuò)。是時(shí)候舉一些突出Stream API強(qiáng)大的例子了。

根據(jù)作者來(lái)把所有的文章分組。

照舊,我們使用循環(huán)方案。

public?Map>?groupByAuthor()?{

????Map>?result?=?new?HashMap<>();

????for?(Article?article?:?articles)?{

????????if?(result.containsKey(article.getAuthor()))?{

????????????result.get(article.getAuthor()).add(article);

????????}?else?{

????????????ArrayList?articles?=?new?ArrayList<>();

????????????articles.add(article);

????????????result.put(article.getAuthor(),?articles);

????????}

????}

????return?result;

}

我們能否找到一個(gè)使用流操作的簡(jiǎn)潔方案來(lái)解決這個(gè)問(wèn)題?

public?Map>?groupByAuthor()?{??

????return?articles.stream()

????????.collect(Collectors.groupingBy(Article::getAuthor));

}

很好!使用 groupingBy 操作和 getAuthor 方法,我們得到了更簡(jiǎn)潔、可讀性更高的代碼。

現(xiàn)在,我們查找集合中所有不同的標(biāo)簽。

我們從使用循環(huán)的例子開(kāi)始。

public?Set?getDistinctTags()?{

????Set?result?=?new?HashSet<>();

????for?(Article?article?:?articles)?{

????????result.addAll(article.getTags());

????}

????return?result;

}

好,我們來(lái)看看如何使用Stream操作來(lái)解決這個(gè)問(wèn)題。

public?Set?getDistinctTags()?{??

????return?articles.stream()

????????.flatMap(article?->?article.getTags().stream())

????????.collect(Collectors.toSet());

}

棒極了!flatmap 幫我把標(biāo)簽列表轉(zhuǎn)為一個(gè)返回流,然后我們使用 collect 創(chuàng)建了一個(gè)集合作為返回值。

以上的就是如何使用可讀性更高的代碼代替循環(huán)的例子。很高興您能夠用心讀完,希望對(duì)您有所幫助。

Java高架構(gòu)師、分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、性能優(yōu)化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻免費(fèi)學(xué)習(xí)加群:835638062 點(diǎn)擊鏈接加入群聊【Java高級(jí)架構(gòu)】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 目錄結(jié)構(gòu) 介紹 Java語(yǔ)言的新特性2.1 Lambdas表達(dá)式與Functional接口2.2 接口的默認(rèn)與靜態(tài)...
    夜風(fēng)月圓閱讀 574評(píng)論 0 2
  • 清晨,空氣中彌漫著一股原油味兒,恰似宿醉乍醒時(shí)分,咀嚼著一大片油膩膩甜絲絲的肥肉,嗓子眼里齁齁的、懵懵的一種不利索。
    果果的老板閱讀 197評(píng)論 0 0
  • 倒計(jì)時(shí)兩周考內(nèi)外!??!
    我是只胖紙閱讀 182評(píng)論 0 1

友情鏈接更多精彩內(nèi)容