以下内容为转载,没有在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:不要再用循环了相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. java流有什么用_在Java中,流比循环有什么优势?

    达令说 有趣的是,面试问题只问优点,而不问缺点,因为两者都有.流是一种更具声明性的样式.或更富有表现力的风格.它可以被认为是更好的声明你的代码的意图,而不是描述如何,它的完成: return peop ...

  3. java while九九乘法表_用java实现三种方法循环输出九九乘法表:

    展开全部 for循环的结构:for(表达式 1:表达式 2:表达式  3) {  循环体  } 表达式 1:一般为赋值表达式:62616964757a686964616fe78988e69d83313 ...

  4. java课后习题七解析_《Java基础入门》_课后习题解析.doc

    <Java基础入门>_课后习题解析 <Java基础入门>课后习题 Java开发入门 一.填空题 1.Java的三大体系分别是_JavaSE_____._JavaEE_____. ...

  5. java课后习题及答案_《java基础入门》课后习题及答案.doc

    <java基础入门>课后习题及答案.doc <Java 基础入门>课后习题及答案博学谷--让 IT 教学更简单,让 IT 学习更有效<Java 基础入门> 课后习题 ...

  6. java的关键字和保留字_「Java」详解常见的53个关键字

    1.在Java中目前一共有53个关键字: 其中由51+2个保留字=53个关键字 [友情提示 : Java的关键字都是小写哟] 2.Java的保留字有多少个?分别是什么? 答:Java的保留字有2个,J ...

  7. 不属于JAVA类中的变量_在Java中,不属于整数类型变量的是( )。_学小易找答案...

    [单选题]整型数据类型中,需要内存空间最少的是( ). [单选题]下列语句序列执行后,i的值是( ). int i=16; do { i/=2; } while( i > 3 ); [填空题]布 ...

  8. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  9. java byte char io流_吃透Java IO:字节流、字符流、缓冲流

    前言有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身, ...

  10. java 多态判断非空_收藏Java 面试题全梳理

    脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...

最新文章

  1. 数据库分享一: MySQL的Innodb缓存相关优化
  2. rsa加密算法java实例,java实现的RSA加密算法详解
  3. JVM 中的守护线程
  4. 值得收藏的JSP连接mysql数据库的例子
  5. java 反射(Reflection) 详解
  6. JAVA JDBC连接mysql编程
  7. 高考封路,大叔骑车强闯
  8. 【Flink】Flink界面如何查看数据是否倾斜
  9. 和吴昊一起玩推理 Round 10 (第一季完结篇) —— 终极推理 —— L与夜神月的对话...
  10. 计算机组成原理总结及知识网图
  11. Windows 7 安装VS2008 SP1 失败
  12. 手机微信桌面计算机不见了怎么办,微信桌面图标不见了怎么办
  13. 分销渠道都有哪些策略
  14. Java导入导出功能
  15. Python 求一元二次方程的解
  16. turtle库基本介绍
  17. 对乔布斯创新能力看法
  18. uniapp禁止单页面侧滑返回
  19. ZJM 与霍格沃兹(字符串哈希)
  20. 22.【sinx幂级数求和】

热门文章

  1. python 字典查询比列表快_Python字典vs列表,哪个更快?
  2. Linux 之四 Ubuntu 20.04 WiFi 无法使用、设置无法显示、远程桌面、SSH、Git、PPA、FFmpeg 等各问题记录
  3. java神剑30变_改动对比 - 神剑养成(一) (MengSword1) - MC百科|最大的Minecraft中文MOD百科...
  4. xml python gb2312_使用Python处理XML格式数据的方法介绍
  5. MySQL / 索引模型
  6. CygWin / 获取 root 权限的方法
  7. 计算机在供电设备中的应用,浅析计算机技术在供电系统中的应用与指导.pdf
  8. linux系统文件查找实验报告,Linux 文件查找与打包
  9. 档案信息服务器配置方案,档案馆档案信息化系统建设方案.doc
  10. 沈阳工程 c语言题库,2017年沈阳航空航天大学航空航天工程学部823C语言程序设计考研仿真模拟题...