什么是流
从支持数据处理操作的源生成的元素序列
java的流式编程更像是一种思想,一种生产方式,将原有的集合的显示操作转换成隐式的操作,使得我们更注重集合操作后的结果而不关注集合处理的过程。
流的名词定义
-
元素序列:
-
可以访问特定元素类型的一组有序值
-
源:
- 提供数据的源
- 有序集合生成流时会保留原有的顺序
- 提供数据的源
-
数据处理操作:
- 流的数据处理功能
- filter
- map
- reduce
- find
- match
- sort等
- 流的数据处理功能
-
流水线
- 多个流连接接起来就形成了一个流水线
-
内部迭代
- 流的迭代操作和集合不同,是在背后进行的
-
中间操作
-
所有不阻断流的操作,即返回值也是一个流的操作连接起来都成为中间操作
-
.filter() .map() .limit() 截取流 .skip() 跳过指定个数元素的流 .sorted() .distinct()
-
filter()
- 参数为一个谓词(谓词返回值为boolean的函数)
- 返回一个符合条件的元素流
-
distinct()
- 返回一个没有重复元素的流
-
limit()
- 返回一个截断流
-
skip()
- 返回一个跳过n个元素的流
-
map()
- 参数为一个函数,将参数映射到集合中的每个元素
- 返回一个流(每一个元素形成一个流,最后被合并成一个扁平化流)
-
flatMap()
- 参数为一个函数,将参数映射到集合中的每个元素
- 返回一个流,(将所有元素映射成同一个流中的内容)
-
orElse(code)
- 返回流操作中的值
- 如果值存在则返回值,如果值不存在则返回指定的code
-
-
终端操作
-
中间操作之后,阻断流的操作即返回值不是流的操作
-
.count() .collect() .forEach() .anyMatch()
-
anyMatch()
- 流中是否有一个元素能匹配给定的谓词
- 返回一个boolean
-
allMatch()
- 流中元素是否都能匹配给定的谓词
- 返回一个boolean
-
noneMatche()
- 流中元素是否都不与给定谓词匹配
- 返回boolean
-
findAny()
- 返回流中的任意元素
-
findFirst()
- 返回流中第一个元素
-
-
短路
- 某些操作不用处理整个流就能得到结果,当对流的操作返回特定的值时就不继续操作流了。
-
归约
- 将流中元素组合起来
- reduce()
- 将流中元素结合起来的操作叫做归约操作,也称为折叠
流的组成部分
- 数据源
- 中间操作
- 终端操作
显示的创建流
- Stream.of(List)
- Arrays.stream(new int[] {1,2,3,4})
- 现实的创建一个IntStream
- 文件流
流操作的注意点
-
流只能被消费一次,重复消费会出现异常
-
java.lang.IllegalStateException: stream has already been operated upon or closed
-