
实现了Iterable接口的集合类(如:所有列表List、集合set)现在都有一个forEach()方法,这个方法接收一个功能接口参数,实际上传递给forEach()方法的参数是一个lambda表达式。使用Java 8的功能,我们的例子将演变成代码清单4中所示的形式。
请注意清单4中的被动迭代与前面三个清单中的主动迭代之间的差异。在主动迭代中由循环结构控制迭代,并且每次通过循环从列表中获取一个对象,然后打印出来。而在清单4中没有显式的循环结构,我们只是告诉forEach()方法对列表中的对象实施打印,迭代控制隐含在forEach()方法中。
3.2 流
如果要做一些比打印名字稍微复杂一点的事情,比如,计算以字母A开头的人名的个数,就需要用lambda表达式,或者使用Java 8的流API(Stream API)来实现更复杂的逻辑了。
流是应用在一组元素上的一次执行的操作序列。集合和数组都可以用来产生流,因此它们称作数据源,但流不存储集合中的元素,相反,流是通过管道(pipeline)操作来自数据源的值序列的一种机制。流管道(Stream Pipeline)由数据源(Stream Source)、若干中间操作(Intermediate Operations)和一个最终操作(Terminal Operation)组成,中间操作对数据集完成过滤、检索等中间业务,而最终操作完成对数据集处理的最终结果,或者调用forEach()方法。
List names = new LinkedList<>();
names.add("Annie");
names.add("Alice");
names.add("Bob");
long count = names.stream()
.filter(name -> name.startsWith("A")
.count();
代码清单5:Java8使用流管道计算以字母A开头的人名的
个数
List names = new LinkedList<>();
names.add("Annie");
names.add("Alice");
names.add("Bob");
long count = 0;
for (String name : names){
if (name.startsWith("A"))
++count;
}
代码清单6:Java 7使用主动迭代计算以字母A开头的人
名的个数
如清单5所示,列表names用于创建流,然后使用过滤器对数据集进行过滤,filter()方法只过滤出以字母A开头的名字,该方法的参数是一个lambda表达式[2]。最后,流的count()方法作为最终操作,得到应用结果。
中间操作除了filter()之外,还有distinct()、sorted()、map()等等,其一般是对数据集的整理(过滤、排序、匹配、抽取等等),返回值一般也是数据集。
最终方法往往是完成对数据集中数据的处理,如forEach(),还有allMatch()、anyMatch()、findAny()、findFirst(),数值计算类的方法有sum()、max()、min()、averag()等等。最终方法也可以是对集合的处理,如reduce()、collect()等等。reduce()方法的处理方式一般是每次都产生新的数据集,而collect()方法是在原数据集的基础上进行更新,过程中不产生新的数据集。流管道操作更为详细的资料请参阅Java Tutorial[3]。
为了理解Java8的流的重要性,请比较代码清单5和代码清单6。代码清单6是大多数Java开发人员比较熟悉的,它使用主动式迭代完成同样的功能。很显然,只要掌握了流的基本概念和操作,清单5中的方法易读性更好且不易出错,特别是,在多线程环境下清单6中的逻辑不是线程安全的,而清单5是线程安全的,它也更容易进行并行化。
Java8集合类不仅具有Stream()方法,该方法返回一个连续的数据流,Java8集合类还有一个parallelStream()方法,该方法返回一个并行流。并行流的作用在于允许管道操作同时在不同的Java线程中执行以提高性能;但要注意,集合元素的处理顺序可能发生改变。测试显示,使用并行流打印列表中的名字,他们打印的顺序不同于他们在列表中出现的顺序。下面是使用并行流之后的代码:
(www.fabiaoba.com),是一个专门从事期刊推广期刊发表、投稿辅导、发表期刊的网站。
本站提供如何投稿辅导、发表期刊,寻求论文刊登合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级论文刊登/国家级论文刊登/
CSSCI核心/医学投稿辅导/职称投稿辅导。
投稿邮箱:fabiaoba365@126.com
在线咨询:
275774677、
1003180928
在线咨询:
610071587、
1003160816
联系电话:13775259981
主管单位:山东省教育厅 主办单位:山东省教委 国内刊号:CN 37-1025/G4 国际刊号:IS...
期刊简介: 《种子科技》(月刊)创刊于1983年,曾用刊名:(种子通讯)是中国种子协...
主管单位:湖北省国资委 主办单位:湖北省经济干部管理学院 出版地:湖北省武汉市 国...
期刊简介: 《高等工程教育研究》是我国第一份、也是唯一一份面向工程教育研究的全国...
主管单位:国家民族事务委员会 主办单位:西北民族大学 出版地:甘肃省兰州市 国际标...
期刊简介: 主管单位:吉林省社会保险事业管理局 主办单位:吉林省人力资源和社会保障...
近来发现有些作者论文投稿存在大量剽窃、抄袭行为,“发表吧”对此类存在大量剽窃、抄袭的论文已经停止编辑、推荐。同时我们也提醒您,当您向“发表吧”投稿时请您一定要保证论文的原创性、唯一性,这既是对您自己负责,更是对他人的尊敬。
此类投稿的论文如果发表之后,对您今后的人生和事业将造成很大的麻烦,后果不堪设想,请您一定要慎重,三思而后行。
如因版权问题引起争议或任何其他原因,“发表吧”不承担任何法律责任,侵权法律责任概由剽窃、抄袭者本人承担。