java 8 stream使用
使用stream代替循环的方案
1、定义一个Article类包括标题、作者、标签
1 private class Article { 2 3 private final String title; 4 private final String author; 5 private final List<String> tags; 6 7 private Article(String title, String author, List<String> tags) { 8 this.title = title; 9 this.author = author; 10 this.tags = tags; 11 } 12 13 public String getTitle() { 14 return title; 15 } 16 17 public String getAuthor() { 18 return author; 19 } 20 21 public List<String> getTags() { 22 return tags; 23 } 24 }
案例一、找出标签为“java”的第一篇文章
(1)传统方法
1 2 3 4 5 6 7 8 9 10 | public Article getFirstJavaArticle() { for (Article article : articles) { if (article.getTags().contains( "Java" )) { return article; } } return null ; } |
(2)使用stream完成上述功能
1 2 3 4 5 | public Optional<Article> getFirstJavaArticle() { return articles.stream() .filter(article -> article.getTags().contains( "Java" )) .findFirst(); } |
我们首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。
案例二、获取所有标签包含“java”的文章
(1)传统方法
1 2 3 4 5 6 7 8 9 10 11 12 | public List<Article> getAllJavaArticles() { List<Article> result = new ArrayList<>(); for (Article article : articles) { if (article.getTags().contains( "Java" )) { result.add(article); } } return result; } |
(2)使用stream完成上述功能
1 2 3 4 5 | public List<Article> getAllJavaArticles() { return articles.stream() .filter(article -> article.getTags().contains( "Java" )) .collect(Collectors.toList()); } |
案例三、根据作者来把所有的文章分组。
(1)传统方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } |
(2)使用stream
1 2 3 4 | public Map<String, List<Article>> groupByAuthor() { return articles.stream() .collect(Collectors.groupingBy(Article::getAuthor)); } |
案例四、查找集合中所有不同的标签
(1)传统方法
1 2 3 4 5 6 7 8 9 10 | public Set<String> getDistinctTags() { Set<String> result = new HashSet<>(); for (Article article : articles) { result.addAll(article.getTags()); } return result; } |
(2)使用stream实现
1 2 3 4 5 | public Set<String> getDistinctTags() { return articles.stream() .flatMap(article -> article.getTags().stream()) .collect(Collectors.toSet()); } |
stream的api链接。
作者:(奎恩)quinns 出处:https://www.cnblogs.com/quinnsun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步