1.java 流是什么?
流是java的api的新成员,它允许你的声明性方式处理数据集合(通过查询语句来表达)而不是临时编写一个实现。
流可以透明地进行并行处理。
之前的java7的代码为
List<Dish> CalDishes = new ArrayList<>();
for (Dish dish:menu){
//用累积器进行筛选元素
if (dish.getCal()<400){
CalDishes.add(dish);
}
}
//用匿名类进行菜品排序
Collections.sort(CalDishes, new Comparator<Dish>(){
public int compare(Dish dish1,Dish Dish2){
return Integer.compare(dish1.getCal(),dish2,getCal());
}
});
//排序后的菜品名称列表
List<String> CalDishesName= new ArrayList<>(){
for (Dish dish: CalDishes){
CalDishesName.add(dish.getName());
}
}
修改为Java8的后的代码
//引入流
import static java.util.Comparator.comparing;
import static java.util.Stream.Collectiors.toList;
List<String> CalDishName= menu.stream()
.filter(d-> d.getCal<400()
.sorted(comparing(Dish::getCal))
.map(Dish::getName)
.collect(toList));
如果是是多线程的方式,可以考虑用stream() 替换成parallelStream()
java8的代码可以看出的好处,上下一比较,java8的简洁
- 代码采用声明性方式编写,说明想要完成什么(筛选热量低的菜品)而不是说明如何实现一个操作,利用循环和if条件等控制流语言。可以利用lambda表达式来筛选高卡路里的菜肴。
基本操作链接来,表达复杂的数据处理流水先(filter后面的Sorted,map和Collect操作)是与具体线性模型无关的高层次构件
新版的Stream Api表达能力非常强
如:
Map<Dish.type,List<Dish>> disesByType = menu.stream().collect(groupingBy(Dish:getType));
Java8 的Stream Api的特点:
- 声明性
- 可复合
- 可并行
流的定义
从支持数据处理操作的源生成的元素序列
元素序列:就像集合一样,流提供了一个借口,可以访问特点元素类型的一组有序值
源:流会使用一个提供数据的源,如:集合,数组,I/O资源。
数据操作处理:流的数据处理功能支持类似数据库的操作如:filter,map,reduce,find,match,sort等
流水线:很多流操作可以回归一个流,多个操作可以链接起来,构成一个更大的流水线
内部迭代:与集合使用迭代器进行显示迭代不同,流的迭代操作是在后台进行的。