第4章 引入流
Java应用使用集合实现业务逻辑,例如选择热量较低的菜,组成一张低卡路里菜单。
- 列出所有系列的菜;
- 组成不同系列的菜单;
- 遍历每个菜单,统计每盘菜的热量总和;
- 筛选出低卡路里菜单;
但集合操作并非完美。
- 无法像数据库声明式指定,必须显式实现业务逻辑;
- 并行处理大量元素复杂,调试麻烦;
引入流作为集合的补充。
第4章和第5章的示例数据如下所示:
public static List<Dish> getMenu() {
return Lists.newArrayList(
new Dish("pork", false, 800, Dish.Type.MEAT),
new Dish("beef", false, 700, Dish.Type.MEAT),
new Dish("chicken", false, 400, Dish.Type.MEAT),
new Dish("french fries", true, 530, Dish.Type.OTHER),
new Dish("rice", true, 350, Dish.Type.OTHER),
new Dish("season fruit", true, 120, Dish.Type.OTHER),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 300, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH));
}
其中Dish.java如下所示:
public class Dish {
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public boolean isVegetarian() {
return vegetarian;
}
public int getCalories() {
return calories;
}
public Type getType() {
return type;
}
@Override
public String toString() {
return name;
}
public enum Type {
MEAT, FISH, OTHER
}
}
4.1 流是什么
4.2 流简介
4.3 流与集合
4.4 流操作
4.5 小结
本章中的一些关键概念。
- 流是从支持数据处理操作的源生成的一系列元素;
- 流抽象化filter、map、sorted等基本操作,完成内部迭代;
- 流操作分为中间操作和终端操作。
- filter和map等中间操作互相连接构建流水线,不会生成任何结果,返回一个新的流;
- forEach和count等终端操作处理流水线,返回非流的结果。
- 流中的元素按需计算;

浙公网安备 33010602011771号