java8系列之新特性Lambda引入原因分析

2020-02-09  本文已影响0人  摸摸脸上的胡渣

引言:虽然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;
    }
}

当我们对红色苹果进行筛选的时候,就可以这样编码:


上一篇 下一篇

猜你喜欢

热点阅读