Java 8实战-第四章

75 阅读2分钟

第4章 引入流

4.1 流是什么

流是Java API的新成员,允许以声明性方式处理数据集合。

List<String> lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
List<String> lowCaloricDishesName = menu.parallelStream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());

代码是以声明性方式写的,然后可以把几个基础操作链接起来,来表达复杂的数据处理流水线,同时保持代码清晰可读。

4.2 流简介

流是支持数据处理操作的源生成的元素序列

4.3 流与集合

流是一个延迟创建的集合:只有在消费者要求的时候才会计算值,而集合则是急切创建的。

4.3.1 只能遍历一次

和迭代器类似,流只能遍历一次。

4.3.2 外部迭代与内部迭代

使用Collection接口需要去做外部迭代(例如for-each),Streams库使用内部迭代。

4.4 流操作

可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作。

4.4.1 中间操作

诸如filter或sorted等中间操作会返回一个流,除非流水线上触发一个终端操作,否则中间操作不会执行任何处理。

4.4.2 终端操作

终端操作会从流的流水线生成结果。

4.4.3 使用流

流的使用一般包括三件事:一个数据源来执行一个查询;一个中间操作链形成一条流的流水线;一个终端操作,执行流水线,并能生成结果。

4.5 小结

以下是你应从本章中学到的一些关键概念。

流是“从支持数据处理操作的源生成的一系列元素”。

流利用内部迭代:迭代通过filter、map、sorted等操作被抽象掉了。

流操作有两类:中间操作和终端操作。

filter和map等中间操作会返回一个流,并可以链接在一起。可以用它们来设置一条流水线,但并不会生成任何结果。

forEach和count等终端操作会返回一个非流的值,并处理流水线以返回结果。

流中的元素是按需计算的。