1 案例引入
- 准备一个model
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dish {
private String name;
/**
* 是不是素食
*/
private Boolean vegetarian;
/**
* 卡路里
*/
private Integer calories;
private Type type;
public enum Type {MEAT, FISH, OTHER}
@Override
public String toString() {
return "Dish{" +
"name='" + name + '\'' +
", vegetarian=" + vegetarian +
", calories=" + calories +
", type=" + type +
'}';
}
}
找出卡路里小于400的菜:传统实现
@Slf4j
public class SimpleStream {
/**
* 模拟一份菜单
*/
final List<Dish> menu = Arrays.asList(
// 猪肉
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),
// tes披萨
new Dish("pizza", true, 550, Dish.Type.OTHER),
// 对虾
new Dish("prawns", false, 300, Dish.Type.FISH),
// 鲑鱼肉
new Dish("salmon", false, 450, Dish.Type.FISH)
);
public List<Dish> getDishLowCalories(List<Dish> menu) {
List<Dish> lowCalories = new ArrayList<>();
for (Dish dish : menu) {
if (dish.getCalories() < 400){
lowCalories.add(dish);
}
}
// 排个序
Collections.sort(lowCalories,(d1,d2)->Integer.compare(d1.getCalories(),d2.getCalories()));
return lowCalories;
}
@Test
public void testGetDishLowCalories(){
List<Dish> dishLowCalories = getDishLowCalories(menu);
log.info("result: {}",dishLowCalories);
}
}
Stream 实现
public List<Dish> getDishLowCaloriesByStream(List<Dish> menu) {
return menu.stream()
.filter(d->d.getCalories()<400)
.sorted(Comparator.comparing(dish -> dish.getCalories()))
.collect(Collectors.toList());
}
@Test
public void testGetDishLowCaloriesByStream(){
List<Dish> dishLowCalories = getDishLowCaloriesByStream(menu);
log.info("result: {}",dishLowCalories);
}
2 Stream介绍
Stream几个概念
Sequence of elements source里面的元素,比如引入案例中的dish
source: 入门案例的菜单menu
Data processing operations:数据的操作过程 入门案例中的filer,sort等
pipelining;流式的工作模式,采用builder的设计模式,链式调用
Stream特点
- 流式的工作模
@Test
public void testStream(){
menu.stream().filter(dish -> {
System.out.println("filter dish ");
if(dish.getCalories()>400){
return true;
}
return false;
}).map(dish -> {
System.out.println("map dish");
return dish.getName();
}).collect(Collectors.toList());
}
filter dish
map dish
filter dish
map dish
filter dish
filter dish
map dish
filter dish
filter dish
filter dish
map dish
filter dish
filter dish
map dish