前言
我们前面说了 lambda表达式,这次我们就将下JDK8的另一个新特性,流(Stream)
stream和lambda搭配使用效果更佳,(如果你没有学过lambda表达式,最好先学习下lambda表达式)
看着逼格更高,也更简洁
我们就拿之前的lambda表达式的举例
我们需要找出集合中所有的 男同学 按照年龄从小到大排序 并且打印出来,我们就这样写
studentList.stream()
.filter(student -> "男".equals(student.getSex()))
.sorted((x, y) -> x.getAge()-y.getAge())
.forEach(student -> System.out.println(JSON.toJSONString(student, true)));
项目代码在 github上 。jdk8 stream流的演示,有一个lambda_demo,找到测试的文件夹就行 (如果文章图片失效也可以在上面看,文章更全更新更及时)

定义
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
流的处理流程一般是这样
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
聚合操作按照分法可以分成两种:中间操作,终端操作
- 中间操作
- 无状态操作
- filter、map、peek等
- 有状态操作
- Sorted、distinct、limit等
- 无状态操作
- 终端操作
- 非短路操作
- foreach、count、collect等
- 短路操作
- findFirst、findAny、anyMatch等
- 非短路操作
中间操作
中间操作和很多命令像不像我们 sql 里面的命令,你可以理解为我们的那些限制语句,通过这些手段得到我们想要的一些数据
终端操作
顾名思义,就是指最后的操作。一个流里面进行完终端操作之后就不能再进行其他操作了
无状态操作
就是不需要全部遍历完之后才能得到,比如 我上面的代码,我只看这个元素符不符合,不符合我就不要,不需要遍历完全部元素。与此相对,有状态操作就是需要整个集合遍历完才行,比如我们的 sorted,我不遍历完所有元素,我怎么知道哪一个最大,哪一个最小
短路操作
就是找到一个我们就不往下执行了。与此相反,非短路操作也很好理解
各个方法演示
我的集合中有如下元素
后面的发不出去
我不知道为什么 文章里面给我说涉政、暴恐,发不了,一个技术文还能这样被限制。其他网站都能发,我挨个挨个调到这一步,后面的内容死活贴不上。 希望大家点击这个链接, java8 stream,这个是在 简书上的 ,内容一模一样。