第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等终端操作会返回一个非流的值,并处理流水线以返回结果。
流中的元素是按需计算的。