多年前,我们在介绍 java8 新特性的时候,提到过作为 java8 一个亮点的新特性 -- streams api
但上文中只是简单介绍了 streams api 的基本用法,事实上,streams api 拥有十分强大的功能,能够大幅缩减编码量,有效提升编码效率与代码质量,达到事半功倍的效果。
本文我们就来详细介绍一下 streams api,来看看他究竟能做到多么强大
Streams API 是对 java 中集合对象功能的增强,他可以让集合的操作变得更加便利、高效
他会自动通过并发执行的方式优化大批量数据集合的聚合操作,同时,结合另一个 java8 的新特性 -- Lambda 表达式,可以极大地提升编程效率,增加代码可读性
基于 jvm 底层的硬件优化,streams api 可以十分方便的利用多核性能,达到并发编程的效果,传统的并发编程往往因为其复杂性十分容易出错,但使用 streams api 则无需担心这个问题
stream 顾名思义,就是“流”,这个名字突出了集合对象流式处理的含义
说到“流式处理”,读者朋友们肯定并不陌生,在 java 中,迭代器就是一种通用的流式处理手段,stream 可以看成是迭代器的高级版本,他不保存数据,他只负责执行预定的算法和计算过程,因此 stream 很像是迭代器的函数式编程版本
和迭代器一样,stream 也是对集合单向遍历一次,并且不可以回头往复,但不同的是,stream 支持了这个过程的自动并发执行,并且将遍历过程变得更加简洁易读
一个流的使用通常包括三个基本步骤:
其中,数据转换操作是以数据源为输入,进行一些操作后返回一个新的流进行接下来操作,数据转换操作可以多次进行,从而让整个流变成一个流管道:
最终,一个流只能有一个 terminal 执行操作,作为流的终结,他生成一个结果或一个 side effect
事实上,真正触发流的遍历操作的就是 terminal 操作的执行
除此以外,如果流的输入是一个无限大的集合,那么还必须具有 short-circuiting
操作,他有两个作用:
知道了 Streams Api 的构成,你可能会很好奇,Streams 究竟可以做到哪些实用的事情呢?对我们的编程又有多大的帮助呢?
下面来看一个小例子,假设我们有一个学生集合,需要对这个集合中分数大于 80 的对象按照他们的 score 进行排序,并且返回由这些对象的 id 组成的 List<Long> 类型集合,我们应该怎么做呢?
private static List<Long> sortStudents(List<Student> students) {
List<Student> studentsOverThreshold = new ArrayList<>();
for (Student student: students) {
if (student.getScore() >= THRESHOLD) {
studentsOverThreshold.add(student);
}
}
Collections.sort(studentsOverThreshold, new Comparator<Student>() {
@Override
public int compare(Student student1, Student student2) {
return student2.getScore().compareTo(student1.getScore());
}
});
List<Long> idResultList = new ArrayList<>();
for (Student student : studentsOverThreshold) {
idResultList.add(student.getId());
}
return idResultList;
}
虽然整个流程中规中矩,但从可读性上来说并不是十分的一目了然
下面,我们使用 Streams API 来优化上面的代码,整个流程就会显得简单了很多:
private static List<Long> sortStudents(List<Student> students) {
return students.stream()
.filter(t -> t.getScore() >= THRESHOLD)
.sorted(Comparator.comparingLong(Student::getScore).reversed())
.map(Student::getId)
.collect(Collectors.toList());
}
相较于上述代码,Streams API 版本的代码显然更加简洁和清晰,可读性、可维护性都有了显著提升,并且如果使用并发模式,Streams API 版本还会在性能上得到增强
由此可见,如果熟练掌握了 Streams API,那么在你的开发过程中,效率会大幅提升,Streams API 的灵活运用也会让你的程序拥有更好的可维护性
流的创建方式有很多种:
上面我们已经提到,流共有三种操作:
下面,我们就来介绍一下这三大类操作中具体有哪些操作
Intermediate 操作的输入是已经创建好的流,输出是进行转换后的流,主要有以下操作:
在一系列 Intermediate 操作之后,一定需要一个终极操作,来对流中的数据做最终的处理,这个“终极操作”就是 Terminal 操作,它包括:
当你要处理无限数据的集合时,通过 short circuiting 操作让程序能够在有限的时间内返回显然是非常必要的
包括上述已经标记过可以用作 Short-circuiting 操作的:
本文我们通过一个例子看到了 Streams API 是如何使用的,以及列出了 java8 中 Streams API 包含的所有操作
那么,这些操作具体应该如何使用呢?敬请关注下一篇文章,详细介绍每一种操作
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有