美文网首页
java8系列之新特性Lambda引入原因分析

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

作者: 摸摸脸上的胡渣 | 来源:发表于2020-02-09 09:59 被阅读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;
        }
    }
    

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

    
    

    相关文章

      网友评论

          本文标题:java8系列之新特性Lambda引入原因分析

          本文链接:https://www.haomeiwen.com/subject/oosppftx.html