JAVA 8 的Stream API操作,别再使用if-else循环了,
2018-03-26 15:15
676 查看
在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码,还要了解循环是怎样工作的。
举例实体类:一篇文章拥有一个标题,一个作者和几个标签。
在第一个例子里,我们要在集合中查找包含“Java”标签的第一篇文章。
看一下使用for循环的解决方案。
现在我们使用Stream API的相关操作来解决这个问题。
我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。
现在,让我们获取所有匹配的元素而不是仅获取第一个。
首先使用for循环方案。
使用Stream操作的方案。
在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。
到目前为止还不错。是时候举一些突出Stream API强大的例子了。
根据作者来把所有的文章分组。
照旧,我们使用循环方案。
我们能否找到一个使用流操作的简洁方案来解决这个问题?
很好!使用 groupingBy 操作和 getAuthor 方法,我们得到了更简洁、可读性更高的代码。
现在,我们查找集合中所有不同的标签。
我们从使用循环的例子开始。
好,我们来看看如何使用Stream操作来解决这个问题。
棒极了!flatmap 帮我把标签列表转为一个返回流,然后我们使用 collect 去创建一个集合作为返回值。
举例实体类:一篇文章拥有一个标题,一个作者和几个标签。
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; } }
在第一个例子里,我们要在集合中查找包含“Java”标签的第一篇文章。
看一下使用for循环的解决方案。
public Article getFirstJavaArticle() { for (Article article : articles) { if (article.getTags().contains("Java")) { return article; } } return null; }
现在我们使用Stream API的相关操作来解决这个问题。
public Optional<Article> getFirstJavaArticle() { return articles.stream() .filter(article -> article.getTags().contains("Java")) .findFirst(); }
我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。
现在,让我们获取所有匹配的元素而不是仅获取第一个。
首先使用for循环方案。
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() 9c6c .contains("Java")) .collect(Collectors.toList()); }
在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。
到目前为止还不错。是时候举一些突出Stream API强大的例子了。
根据作者来把所有的文章分组。
照旧,我们使用循环方案。
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; }
我们能否找到一个使用流操作的简洁方案来解决这个问题?
public Map<String, List<Article>> groupByAuthor() { return articles.stream() .collect(Collectors.groupingBy(Article::getAuthor)); }
很好!使用 groupingBy 操作和 getAuthor 方法,我们得到了更简洁、可读性更高的代码。
现在,我们查找集合中所有不同的标签。
我们从使用循环的例子开始。
public Set<String> getDistinctTags() { Set<String> result = new HashSet<>(); for (Article article : articles) { result.addAll(article.getTags()); } return result; }
好,我们来看看如何使用Stream操作来解决这个问题。
public Set<String> getDistinctTags() { return articles.stream() .flatMap(article -> article.getTags().stream()) .collect(Collectors.toSet()); }
棒极了!flatmap 帮我把标签列表转为一个返回流,然后我们使用 collect 去创建一个集合作为返回值。
相关文章推荐
- 使用svnkit api,纯java操作svn,实现svn提交,更新等操作(修正版)
- 代码重构----使用java有限状态机来消除太多的if else判断
- 循环语句中的if else 结构里面如何使用break语句?
- java操作redis。jedis使用api
- 使用JAVA的开源API-JExcelAPI来操作Excel,实现基本的功能
- java使用jxl,jExcelAPI操作excel代码总结
- Java 8中的Stream API使用指南
- 慕课网-安卓工程师初养成-6-5 使用循环操作 Java 中的数组
- Java中if...else语句使用的学习教程
- HBase Java API使用操作例子
- Java的Struts框架中的if/else标签使用详解
- 使用EJB3 Java 持久化API来标准化Java的持久化操作
- Java基础---使用循环操作Java中的数组(三十一)
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法
- 考考你的基础知识:C++ 文件操作ofstream、ifstream使用
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- 使用Java Excel API (JXL)在Java环境下操作Excel
- Java操作mongoDB2.6的常见API使用方法
- 使用Java StAX API(XML Stream Process API)写的XMLParser
- 循环语句中的if else 结构里面如何使用break语句?