1. Stream API简介:
A sequence of elements supporting sequential and parallel aggregate operations.
先来看看Java里面是怎么定义Stream的我们来解读一下上面的那句话:
1.可以支持顺序和并行的对原Stream进行汇聚的操作; 2.Stream是元素的集合,这点让Stream看起来用些类似Iterator;
我们可以把Stream当成一个高级版本的Iterator,原始版本的Iterator,用户需要一个一个的遍历元素并对其执行某些操作;Stream用户只要给出需要对元素执行操作,比如“过滤、排序、分组、聚合。Stream API 配合Lambda表达式可以提高代码可读性和编码效率,Stream API也支持并行操作,我们不用再花费很多精力来编写容易出错的多线程代码,Stream API已经替我们做好了,并且充分利用多核CPU的优势。借助Stream API和Lambda,开发人员可以很容易的编写出高性能的并发处理程序。1.1 Stream 初体验 Stream API是Java 8中加入的一套新的API,主要用于处理集合操作,不过它的处理方式与传统的方式不同,称为“数据流处理”。流(Stream)类似于关系数据库的查询操作,是一种声明式操作。比如要从数据库中获取所有年龄大于30岁的用户,并按照用户的年龄大小进行排序,用一条SQL语句就可以搞定,不过使用Java程序实现就会显得有些繁琐,这时候可以使用流:
1.2 剖析Stream语法:
a:创建Stream(流)
b:转换成新的Stream
c:聚合结果
1.3 集合和流做一个对比:
集合在java中是一个容器用于存放数据,流不关心数据它只关心如何处理数据,相当于Iterator但比Iterator强大很多。
集合、流遍历方式,集合一般遍历用froeach,这种方式称为外部迭代,而流用得是内部迭代,我们只需要告诉它接下来要干什么。
1.4 注意事项:
流只能遍历一次,遍历完流会自动关闭,如再需要遍历需要重新再获取一个流,一个流遍历两次会抛出:java.lang.IllegalStateException: stream has already been operated upon or closed
2.创建流
2.1 Stream静态方法创建流
2.2 数组创建流
2.3 文件创建流
2.4 函数创建流
3. 流API应用
filter():对流元素过滤
distinct()
去重
其他方法就不画图很好理解,留给读者思考
limit()
:截取流中前面几个元素skip()
:跳过流中前面几个元素toArray()
:将流转换为数组reduce()
:对流中的元素归约操作,将每个元素合起来形成一个新的值collect()
:对流的汇总操作,比如输出成List
集合anyMatch()
:匹配流中的元素,类似的操作还有allMatch()
和noneMatch()
方法findFirst()
:查找第一个元素,类似的还有findAny()
方法max()
:求最大值min()
:求最小值count()
:求总数
4. 聚合
前面两部分主要做的是创建流及中间流的各种处理,现在来介绍聚合(数据收集),用到主要方法collect(),将流中的元素累积成一个汇总结果,具体的做法是通过定义新的Collector接口来定义的。具体来看(最常用的toList())
Collectors工具类为我们提供了用于汇总的方法包括 summarizingInt()summarizingLong()和summarizingDouble(),由于图书的价格为Double类型,这里年龄是int类型,所以用summarizingInt():
4.2 分组:类似mysql group关键字
介绍到这里相信你对Stream有一定了解,下一期会讲解Optional。
代码地址github:
https://github.com/nonhung/nonhung/
你点赞是对我最大支持,你评论是对我最大帮助