java递增不使用循环_[转]Java 8:不要再用循环了
以下內容為轉載,沒有在jdk8中測試,具體業務場景是否存在BUG或使用需要注意的地方有待測試。
------------------分割線----------------------
正如我之前所寫的,Java 8中的新功能特性改變了游戲規則。對Java開發者來說這是一個全新的世界,并且是時候去適應它了。
在這篇文章里,我們將會去了解傳統循環的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允許我們去表達我們想要完成什么而不是要怎樣做。這正是循環的不足之處。要確保循環的靈活性是需要付出代價的。return、break 或者 continue都會顯著地改變循環的實際表現。這迫使我們不僅要清楚我們要實現怎樣的代碼,還要了解循環是怎樣工作的。
在介紹Java 8的流(Stream)時,我們學會了一些集合操作的實用技巧。現在我們要看看怎樣把這些循環轉換為更簡潔,可讀性更高的代碼。
開始編碼!
好吧,講的夠多了,是時候展示一些例子了!
這次我們要以文章為例子。一篇文章擁有一個標題,一個作者和幾個標簽。
private classArticle {private finalString title;private finalString author;private final Listtags;private Article(String title, String author, Listtags) {this.title =title;this.author =author;this.tags =tags;
}publicString getTitle() {returntitle;
}publicString getAuthor() {returnauthor;
}public ListgetTags() {returntags;
}
}
每個例子都會包含一個使用傳統循環的方案和一個使用Java 8新特性的方案。
在第一個例子里,我們要在集合中查找包含“Java”標簽的第一篇文章。
看一下使用for循環的解決方案。
publicArticle getFirstJavaArticle() {for(Article article : articles) {if (article.getTags().contains("Java")) {returnarticle;
}
}return null;
}
現在我們使用Stream API的相關操作來解決這個問題。
public OptionalgetFirstJavaArticle() {returnarticles.stream()
.filter(article-> article.getTags().contains("Java"))
.findFirst();
}
是不是很酷?我們首先使用 filter 操作去找到所有包含Java標簽的文章,然后使用 findFirst() 操作去獲取第一次出現的文章。因為Stream是“延遲計算”(lazy)的并且filter返回一個流對象,所以這個方法僅在找到第一個匹配元素時才會處理元素。
現在,讓我們獲取所有匹配的元素而不是僅獲取第一個。
首先使用for循環方案。
public ListgetAllJavaArticles() {
List result = new ArrayList<>();for(Article article : articles) {if (article.getTags().contains("Java")) {
result.add(article);
}
}returnresult;
}
使用Stream操作的方案。
public ListgetAllJavaArticles() {returnarticles.stream()
.filter(article-> article.getTags().contains("Java"))
.collect(Collectors.toList());
}
在這個例子里我們使用 collection 操作在返回流上執行少量代碼而不是手動聲明一個集合并顯式地添加匹配的文章到集合里。
到目前為止還不錯。是時候舉一些突出Stream API強大的例子了。
根據作者來把所有的文章分組。
照舊,我們使用循環方案。
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);
}
}returnresult;
}
我們能否找到一個使用流操作的簡潔方案來解決這個問題?
public Map>groupByAuthor() {returnarticles.stream()
.collect(Collectors.groupingBy(Article::getAuthor));
}
很好!使用 groupingBy 操作和 getAuthor 方法,我們得到了更簡潔、可讀性更高的代碼。
現在,我們查找集合中所有不同的標簽。
我們從使用循環的例子開始。
public SetgetDistinctTags() {
Set result = new HashSet<>();for(Article article : articles) {
result.addAll(article.getTags());
}returnresult;
}
好,我們來看看如何使用Stream操作來解決這個問題。
public SetgetDistinctTags() {returnarticles.stream()
.flatMap(article->article.getTags().stream())
.collect(Collectors.toSet());
}
棒極了!flatmap 幫我把標簽列表轉為一個返回流,然后我們使用 collect 去創建一個集合作為返回值。
一切皆有可能
以上的就是如何使用可讀性更高的代碼代替循環的例子。務必仔細看看Stream API,因為這篇文章僅僅提到它的一些皮毛而已。
更新
收到solarfuse和dhruvgairola的評論后,更新了getDistinctTags()例子,使用集合(Set)作為返回集合。
總結
以上是生活随笔為你收集整理的java递增不使用循环_[转]Java 8:不要再用循环了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java过滤4字节_乐字节Java8核心
- 下一篇: 北交所限价申报应当符合的条件