Java8已经出来很久,工作学习中总有部分代码使用的Lambda表达式,对于不怎么熟悉的人来说确实有阅读障碍,但是在实际工作中使用起来还是非常便的。
可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
(Apple a) -> "green".equals(a.getColor()
⬆ ⬆ ⬆
参数 箭头 主体
先前(筛选绿苹果)
List greenApple1 = new ArrayList<>();
for (Apple apple : inventory) {
Apple apple1 = new Apple();
if("green".equals(apple.getColor())){
apple1.setColor("green");
apple1.setWeight(apple.getWeight());
appleColor.add(apple1);
}
}
之后(筛选绿苹果)
List collect = inventory.stream()
.filter(apple -> "green".equals(apple.getColor()))
.collect(Collectors.toList());
通过filter()函数筛选,再用collect()转成所需要的对象。
2. 流是什么
流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了。
List 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),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 300, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH) );
//筛选出 400卡以下并且排序的菜名
List lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
类似一个流水线操作。因为filter、sorted、map和collect等操作是与具体线程模型无关的高层次构件,所以
它们的内部实现可以是单线程的。无效考虑线程安全问题。