20191121-Java8 Action 第四章:引入流
什么是流
流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。可以把它看成遍历数据集的高级迭代器。
流可以透明的并行处理。
流简介
流的简短定义:从支持数据处理操作的源生成的元素序列。
- 元素序列——流提供了一个接口,可以访问特定元素类型的一组有序值
- 源——流会使用一个提供数据的源,如集合、数组或者输入|输出资源。(从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素与列表一致)
- 数据处理操作——流支持数据处理功能(类似于数据库的操作,以及函数式编程语言中的常用操作,如filter、map、reduce、find、match、sort等)。流的操作可以顺序执行,也可以并行执行。
- 流水线——很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大的流水线。
- 内部迭代
流与集合
集合与流之间的差异就在于什么时????进行计算。
集合是一个内存中的数据结构,它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。(你可以往集合里加东西或者????东西,但是不管什么时候,集合中的每个元素都是放在内存里的,元素都得先算出来才能成为集合的一部分。)
流则是在概念上????定的数据结构(你不能添加或????除元素),其元素则是????需计 算的。
流只能遍历一次。遍历完之后,这个流已经被消费掉了,可以从原始数据源那里再获得一个新的流来重新遍历一遍,就像迭代器一样。
流:内部迭代
流的操作
流的操作可以分为两大类
- 中间操作:诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。重要的是,除非流水线上触发一个终端操作,否则中间操作不会执行任何处理。
- 终端操作:终端操作会从流的流水线生成结果。其结果是任何不是流的值,比如List、Integer,甚至void。