服装网站建设项目规划书,禄丰县住房和城乡建设局网站,南昌建设医院网站,微信小程序源码免费下载转载自 你还在Java8中使用循环语句吗#xff1f;
Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界#xff0c;并且是时候去适应它了。
在这篇文章里#xff0c;我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中#xff0c;最棒…转载自 你还在Java8中使用循环语句吗
Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界并且是时候去适应它了。
在这篇文章里我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中最棒的特性就是允许我们去表达我们想要完成什么而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码还要了解循环是怎样工作的。
现在我们看看怎样把这些循环转换为更简洁可读性更高的代码。 代码转换
好吧讲的够多了是时候展示一些例子了
这次我们要以文章为例子。一篇文章拥有一个标题一个作者和几个标签。
private class Article {private final String title;private final String author;private final ListString tags;private Article(String title, String author, ListString tags) {this.title title;this.author author;this.tags tags;}public String getTitle() {return title;}public String getAuthor() {return author;}public ListString getTags() {return tags;}
}
每个例子都会包含一个使用传统循环的方案和一个使用Java 8新特性的方案。
在第一个例子里我们要在集合中查找包含“Java”标签的第一篇文章。
看一下使用for循环的解决方案。
public Article getFirstJavaArticle() {for (Article article : articles) {if (article.getTags().contains(Java)) {return article;}}return null;
}现在我们使用Stream API的相关操作来解决这个问题。
public OptionalArticle getFirstJavaArticle() {
return articles.stream().filter(article - article.getTags().contains(Java)).findFirst();
}
是不是很酷我们首先使用 filter 操作去找到所有包含Java标签的文章然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”lazy的并且filter返回一个流对象所以这个方法仅在找到第一个匹配元素时才会处理元素。
现在让我们获取所有匹配的元素而不是仅获取第一个。
首先使用for循环方案。
public ListArticle getAllJavaArticles() {ListArticle result new ArrayList();for (Article article : articles) {if (article.getTags().contains(Java)) {result.add(article);}}return result;
}
使用Stream操作的方案。
public ListArticle getAllJavaArticles() { return articles.stream().filter(article - article.getTags().contains(Java)).collect(Collectors.toList());}
}
在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。
到目前为止还不错。是时候举一些突出Stream API强大的例子了。
根据作者来把所有的文章分组。
照旧我们使用循环方案。
public MapString, ListArticle groupByAuthor() {MapString, ListArticle result new HashMap();for (Article article : articles) {if (result.containsKey(article.getAuthor())) {result.get(article.getAuthor()).add(article);} else {ArrayListArticle articles new ArrayList();articles.add(article);result.put(article.getAuthor(), articles);}}return result;
}
我们能否找到一个使用流操作的简洁方案来解决这个问题
public MapString, ListArticle groupByAuthor() { return articles.stream().collect(Collectors.groupingBy(Article::getAuthor));
}
很好使用 groupingBy 操作和 getAuthor 方法我们得到了更简洁、可读性更高的代码。
现在我们查找集合中所有不同的标签。
我们从使用循环的例子开始。
public SetString getDistinctTags() {SetString result new HashSet();for (Article article : articles) {result.addAll(article.getTags());}return result;
}
好我们来看看如何使用Stream操作来解决这个问题。
public SetString getDistinctTags() { return articles.stream().flatMap(article - article.getTags().stream()).collect(Collectors.toSet());
}
棒极了flatmap 帮我把标签列表转为一个返回流然后我们使用 collect 创建了一个集合作为返回值。
以上的就是如何使用可读性更高的代码代替循环的例子。很高兴您能够用心读完希望对您有所帮助。