转载自   你还在Java8中使用循环语句吗?

Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界,并且是时候去适应它了。

在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么,而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码,还要了解循环是怎样工作的。

现在我们看看怎样把这些循环转换为更简洁,可读性更高的代码。

代码转换

好吧,讲的够多了,是时候展示一些例子了!

这次我们要以文章为例子。一篇文章拥有一个标题,一个作者和几个标签。

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 8新特性的方案。

在第一个例子里,我们要在集合中查找包含“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().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 创建了一个集合作为返回值。

以上的就是如何使用可读性更高的代码代替循环的例子。很高兴您能够用心读完,希望对您有所帮助。

你还在Java8中使用循环语句吗?相关推荐

  1. Shell:shell中的循环语句

    shell中的循环语句 for语法格式 for var in list;do commands done 其中list可以包含: 1) 直接写 for alpha in a b c d;doecho ...

  2. JavaScript中的循环语句-while循环

    -JavaScript中有三种循环语句,分别为while循环,do-while循环和for循环. 现在来聊一聊while循环. 首先讲一讲 if 语句和while 循环的格式是非常相似的,但是它们都拥 ...

  3. continue语句只用于循环语句中_Python中的循环语句

    1.知识点介绍 循环语句是编程中的重要内容,可以用于批量完成一系列操作. Python中的循环语句主要有 while 和 for,基本形式如下: while语句 #当条件满足的时候不断执行操作whil ...

  4. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

  5. Shell中的循环语句for、while、until实例讲解

     在编程语言中,循环语句是最基本的语法之一,在Shell(这里是Bash)中也不例外,再把以前自己写过的相关内容整理一下吧. 这里包括for/while/until循环,以及变量自增的语法实例. ...

  6. 【C语言进阶深度学习记录】七 C语言中的循环语句

    文章目录 1 循环语句分析 1.1 do...while循环 1.2 while循环 1.3 for循环 1.4 三种循环语句使用对比 2 break和continue的区别 3 总结 1 循环语句分 ...

  7. 【转】foreach for each for_each引发的探讨:c++世界中的循环语句

    转自:foreach for each for_each引发的探讨:c++世界中的循环语句_w_419675647的博客-CSDN博客 一 背景: 代码中看到 for each,注意,两个单词中间没有 ...

  8. php中用for循环制作矩形,PHP中for循环语句的几种变型

    PHP中for循环语句的几种变型 2021-01-22 10:21:42406 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多 ...

  9. PHP中for循环设计无穷循环,PHP中for循环语句的几种“变态”用法

    PHP中for循环语句的几种"变态"用法 for语句可以说是PHP(同时也是多种语言)的循环控制部份最基本的一个语句了,for语句的执行规律和基础用法在这里就不多说,可以参见PHP ...

最新文章

  1. 对XMLHttpRequest异步请求的面向对象封装
  2. leetcode 127. 单词接龙(bfs)
  3. 在线代码编辑器 Codemirror 的轻量级 React 组件
  4. a除b的余数【取模(%)与取余(/)的区别】
  5. 升级Exchange server 2010 SP1至SP3版本相关问题解决方法
  6. Nginx系列(7):Nginx高并发初探
  7. cs229 课程知识点 简要记录
  8. 我的世界java材质包推荐下载_我的世界材质包排行-Minecraft材质包-我的世界高清材质包下载大全-Minecraft中文分享站...
  9. 防卒指南:996+健身≈猝死
  10. struts2 Action中获取session,request,respon值
  11. 换个花样玩C++(1)步步深入窥探const
  12. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataSource' is defin
  13. 教你一个无本万利的赚钱方法_一个在股市中稳健赚钱的方法
  14. JAVA之翻转棋游戏
  15. videojs+hls+rtmp流媒体播放
  16. UTC和本地时间互相转换
  17. “只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔
  18. 训练日记 | 2021.03.21 | 天梯赛选拔赛
  19. Stitch Fix玩转时尚算法,年销7.3亿
  20. python自动化运维——系统批量运维管理器pexpect详解

热门文章

  1. 78. 子集022(回溯法)
  2. 7-1 多数组排序 (12 分)三种做法(冒泡排序 ; 重写sort方法 ;利用sort和栈)
  3. 数据结构与算法--数组:二维数组中查找
  4. 记录一次线上超时异常查询
  5. int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考
  6. pip ImportError: cannot import name 'main' after update
  7. 几道偏序问题(数据结构)
  8. P2494 [SDOI2011]保密(网络流/最小割/01分数规划)
  9. P2261 [CQOI2007]余数求和 整除分块
  10. P3168 [CQOI2015]任务查询系统 主席树 + 差分