[转]Java 8:不要再用循环了
生活随笔
收集整理的這篇文章主要介紹了
[转]Java 8:不要再用循环了
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
以下內(nèi)容為轉(zhuǎn)載,沒(méi)有在jdk8中測(cè)試,具體業(yè)務(wù)場(chǎng)景是否存在BUG或使用需要注意的地方有待測(cè)試。
------------------分割線----------------------
正如我之前所寫的,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)是怎樣工作的。在介紹Java 8的流(Stream)時(shí),我們學(xué)會(huì)了一些集合操作的實(shí)用技巧。現(xiàn)在我們要看看怎樣把這些循環(huán)轉(zhuǎn)換為更簡(jiǎn)潔,可讀性更高的代碼。 開(kāi)始編碼!好吧,講的夠多了,是時(shí)候展示一些例子了!這次我們要以文章為例子。一篇文章?lián)碛幸粋€(gè)標(biāo)題,一個(gè)作者和幾個(gè)標(biāo)簽。 private class Article {private final String title;private final String author;private final List<String> tags;private Article(String title, String author, List<String> tags) {this.title = title;this.author = author;this.tags = tags;}public String getTitle() {return title;}public String getAuthor() {return author;}public List<String> 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<Article> 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<Article> getAllJavaArticles() {List<Article> result = new ArrayList<>();for (Article article : articles) {if (article.getTags().contains("Java")) {result.add(article);}}return result; } 使用Stream操作的方案。 public List<Article> 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<String, List<Article>> groupByAuthor() {Map<String, List<Article>> result = new HashMap<>();for (Article article : articles) {if (result.containsKey(article.getAuthor())) {result.get(article.getAuthor()).add(article);} else {ArrayList<Article> articles = new ArrayList<>();articles.add(article);result.put(article.getAuthor(), articles);}}return result; } 我們能否找到一個(gè)使用流操作的簡(jiǎn)潔方案來(lái)解決這個(gè)問(wèn)題? public Map<String, List<Article>> groupByAuthor() { return articles.stream().collect(Collectors.groupingBy(Article::getAuthor)); } 很好!使用 groupingBy 操作和 getAuthor 方法,我們得到了更簡(jiǎn)潔、可讀性更高的代碼。現(xiàn)在,我們查找集合中所有不同的標(biāo)簽。我們從使用循環(huán)的例子開(kāi)始。 public Set<String> getDistinctTags() {Set<String> result = new HashSet<>();for (Article article : articles) {result.addAll(article.getTags());}return result; } 好,我們來(lái)看看如何使用Stream操作來(lái)解決這個(gè)問(wèn)題。 public Set<String> getDistinctTags() { return articles.stream().flatMap(article -> article.getTags().stream()).collect(Collectors.toSet()); } 棒極了!flatmap 幫我把標(biāo)簽列表轉(zhuǎn)為一個(gè)返回流,然后我們使用 collect 去創(chuàng)建一個(gè)集合作為返回值。一切皆有可能以上的就是如何使用可讀性更高的代碼代替循環(huán)的例子。務(wù)必仔細(xì)看看Stream API,因?yàn)檫@篇文章僅僅提到它的一些皮毛而已。更新收到solarfuse和dhruvgairola的評(píng)論后,更新了getDistinctTags()例子,使用集合(Set)作為返回集合。
原文鏈接:?deadcoderising?翻譯:?ImportNew.com?-?進(jìn)林
譯文鏈接:?http://www.importnew.com/14841.html
[?轉(zhuǎn)載請(qǐng)保留原文出處、譯者和譯文鏈接。]
轉(zhuǎn)載于:https://www.cnblogs.com/GYoungBean/p/4261478.html
總結(jié)
以上是生活随笔為你收集整理的[转]Java 8:不要再用循环了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于 Asp.Net的 Comet 技术
- 下一篇: FormShortCut MainFor