流是什么
流是Java API的新成员,它允许你以声明式方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现),也可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明的并行处理,无需写任何多线曾代码。
我们来对比一下使用流和不使用流的两种情况下的筛选目标集合代码。
不使用流的代码:
List<Dish> lowCaloricDishes = new ArrayList<>();
for(Dish d: menu){
if(d.getCalories() < 400){
lowCaloricDishes.add(d);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
public int compare(Dish d1, Dish d2){
return Integer.compare(d1.getCalories(), d2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish d: lowCaloricDishes){
lowCaloricDishesName.add(d.getName());
}
在这段代码中,你用了一个“垃圾变量” lowCaloricDishes 。它唯一的作用就是作为一次性的中间容器。
使用流的代码:
List<String> lowCaloricDishesName =menu.parallelStream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dishes::getCalories))
.map(Dish::getName)
.collect(toList());
使用流的代码,有几个显而易见的好处
- 代码是以声明式方式写的
- 你可以把几个基础操作连接起来,来表达复杂的数据处理流水线,同时保持代码清晰可读。
再看一个例子,代码如下:
Map<Dish.Type, List<Dish>> dishesByType =menu.stream().collect(groupingBy(Dish::getType));
作用是按照Map里面的类别对menu集合进行分组。
网友评论