什么是流?
流是Java API的新成员,它允许你已声明式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。并且流还可以透明的并行处理,你无需再写任何多线程代码了
比如现在有一个菜肴列表 菜肴类中有菜肴名称name和卡路里calories
现在我们需要把卡路里小于300的菜肴名称按照卡路里排序并保存List中
Java 8前
上面代码分别处理卡路里小于300、匿名类排序、处理排序后菜名列表
此外 这段代码中 lowCaloricDishes的唯一作用就是作为一次性的中间容器,而在Java 8中 实现细节被放在它本该归属的类库了
Java 8
如果想要并行这段代码,你只要把stream()换成parallelStream()即可
再比如我们希望对菜肴类别进行分组
流的特性
通过上面两个例子我们可以发现Java 8的优势
声明式——更简简洁,更宜读
可复合——更灵活
可并行——性能更好
这里需要说明一点,和迭代器类似,流只能遍历一次,遍历完后,我们说这个流已经被消费掉了
所以要记得:流只能被消费一次!
外部迭代与内部迭代
集合:外部迭代
流:内部迭代
流的操作
可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作
总结下流的使用
一个数据源(如集合)来执行一个查询
一个中间操作链,形成一条流的流水线
一个终端操作,执行流水线并生成结果
中间操作有
filter、map、limit、sorted、distinct
终端操作有
forEach、count、collect
下次我们详细分享下可以用的流操作来表达复杂的数据处理查询
比如过滤、切片、查找、匹配、映射、归约、去重、跳过等等