java 8 stream api_java8 Streams API 详解(上) -- streams 入门

2.1 Streams API 能做什么

Streams API 是对 java 中集合对象功能的增强,他可以让集合的操作变得更加便利、高效

他会自动通过并发执行的方式优化大批量数据集合的聚合操作,同时,结合另一个 java8 的新特性 -- Lambda 表达式,可以极大地提升编程效率,增加代码可读性

基于 jvm 底层的硬件优化,streams api 可以十分方便的利用多核性能,达到并发编程的效果,传统的并发编程往往因为其复杂性十分容易出错,但使用 streams api 则无需担心这个问题

2.2 Stream 是什么

stream 顾名思义,就是“流”,这个名字突出了集合对象流式处理的含义

说到“流式处理”,读者朋友们肯定并不陌生,在 java 中,迭代器就是一种通用的流式处理手段,stream 可以看成是迭代器的高级版本,他不保存数据,他只负责执行预定的算法和计算过程,因此 stream 很像是迭代器的函数式编程版本

和迭代器一样,stream 也是对集合单向遍历一次,并且不可以回头往复,但不同的是,stream 支持了这个过程的自动并发执行,并且将遍历过程变得更加简洁易读

2.3 Stream 的构成

一个流的使用通常包括三个基本步骤:获取数据源

数据转换 -- Intermediate

执行操作 -- Terminal

其中,数据转换操作是以数据源为输入,进行一些操作后返回一个新的流进行接下来操作,数据转换操作可以多次进行,从而让整个流变成一个流管道:

ad8827786c81316076473eab4b0b9f96.png

最终,一个流只能有一个 terminal 执行操作,作为流的终结,他生成一个结果或一个 side effect

事实上,真正触发流的遍历操作的就是 terminal 操作的执行

除此以外,如果流的输入是一个无限大的集合,那么还必须具有 short-circuiting 操作,他有两个作用:对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream

对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果

2.4 流能做什么

知道了 Streams Api 的构成,你可能会很好奇,Streams 究竟可以做到哪些实用的事情呢?对我们的编程又有多大的帮助呢?

下面来看一个小例子,假设我们有一个学生集合,需要对这个集合中分数大于 80 的对象按照他们的 score 进行排序,并且返回由这些对象的 id 组成的 List 类型集合,我们应该怎么做呢?

2.4.1 java7 版本

private static List sortStudents(List students) {

List studentsOverThreshold = new ArrayList<>();

for (Student student: students) {

if (student.getScore() >= THRESHOLD) {

studentsOverThreshold.add(student);

}

}

Collections.sort(studentsOverThreshold, new Comparator() {

@Override

public int compare(Student student1, Student student2) {

return student2.getScore().compareTo(student1.getScore());

}

});

List idResultList = new ArrayList<>();

for (Student student : studentsOverThreshold) {

idResultList.add(student.getId());

}

return idResultList;

}

虽然整个流程中规中矩,但从可读性上来说并不是十分的一目了然

2.4.2 Streams API 版本

下面,我们使用 Streams API 来优化上面的代码,整个流程就会显得简单了很多:

private static List sortStudents(List 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 的灵活运用也会让你的程序拥有更好的可维护性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值