引言:虽然JDK11已经进入特性冻结状态,但是从我自身来讲,目前JDK8 Lambda、Stream的使用率还不算很高,这些都是很好用的API哎!那就重新总结一波,同时也帮助小伙伴们熟悉一下,一起使用Lambda、Stream!
摘要:本文旨在帮助大家了解Lambda的引入原因以及使用方法,是自己看过《java8 实战》的总结,有什么疑问,可以评论,也可以翻看《java8 实战》自己摸索。如果文中有错误,望不吝赐教。
咱们做开发的,最不想看到的局面就是需求频繁的改动,并且改动的没有意义。出于可以最小程度的修改代码来得到最大程度便捷的实现,java 8提出了一个概念——行为参数化。
行为参数化
什么是行为参数化呢?可以这么理解:
行为 -> Function,没错就是一个函数。
参数化 -> 可像参数一样进行传递。
合起来就是,java 8中,引入了可以使得函数,像参数一样,进行传递的新特性。
在java 8之前,能够进行传递的只有变量(严格来说是变量的引用)。来到java 8,可以使用Lambda表达式来实现行为参数化。
具体实例分析
在java8还没有出现之前,你接到这样一个需求,帮助果农大爷,从库存中筛选指定标准的苹果,苹果的定义:
@Data
@ToString
public class Apple {
private int weight;
private String color;
private String origin;
public Apple() {
}
public Apple(int weight, String color) {
this.weight = weight;
this.color = color;
}
public Apple(int weight, String color, String origin) {
this.weight = weight;
this.color = color;
this.origin = origin;
}
}
大爷说:“孩砸,帮我筛选不同颜色的苹果,好卖!”。
于是乎,你撸出了下面的代码:
//筛选不同的颜色的苹果
public static List<Apple> filterApplesByColor(String color,List<Apple> apples){
List<Apple> result = new ArrayList<Apple>();
for(Apple apple : apples){
if(apple.getColor().equals(color)){
result.add(apple);
}
}
return result;
}
大爷又说了:“孩砸,帮我筛选不同重量的苹果,好卖!”
于是乎,你又撸出了下面的代码:
//筛选不同重量的苹果
public static List<Apple> filterApplesByWeight(int weight,List<Apple> apples){
List<Apple> result = new ArrayList<Apple>();
for(Apple apple : apples){
if(apple.getWeight() > weight){
result.add(apple);
}
}
return result;
}
结果,大爷又说:“孩砸,帮我筛选不同产地的苹果,好卖!”
老子不撸了!什么大爷!明明是刚实习的pm!
但是,pm不是T序列的(jd除外),你没有办法更改人家的思维逻辑,只能从自己的代码入手,当你仔细的观察了代码,发现上面两段代码,只有if块中不一样,渐渐地你陷入了沉思。。。
当存在很多重合的逻辑的时候,就要将重合的逻辑进行提取,抽象。于是乎你进行了抽象,首先,抽象出了一个接口
//这个接口的意义为:定义了筛选苹果的标准,所有筛选的类,都必须来实现这个接口,来达到多态。
@FunctionalInterface //这个注释暂时按下不表,一会解释。
public interface ApplePredicate {
boolean filter(Apple apple);
}
并且重新实现了按照颜色进行筛选的类,重写了其中的filter方法
public class RedAppleFilter implements ApplePredicate {
@Override
public boolean filter(Apple apple) {
if (StringUtils.equals(apple.getColor(),"red")){
return true;
}
return false;
}
}
当我们对红色苹果进行筛选的时候,就可以这样编码:
网友评论