普歌 - lambda表达式详解

lambda表达式


前言

在之前的文章中语法糖中介绍了java每个版本中的一些优化,但是没有把lambda加到当中,因为我觉得lambda表达式是一个重难点,也是面试中的一个考点。

还有平时我们在看一些项目的时候也会看到lambda表达式的出现,但是却不知道如何去解读,那么今天我就单独出一篇博客来说清楚,大家坐好发车了~~~

注意:lambda的版本是JDK8,小伙伴们在使用的时候一定要看清楚版本号啊。

一、lambda的导读

lambda是什么?

Lambda在希腊中是第十一位字母,但在java中他却是编程语言中函数的意思,是一个匿名函数,即没有函数名的函数(具体是怎么来的呢?在下面我在lambda的衍化中会详细解释道)其实它的本质其实还是java中的一颗语法糖。

我们为什么要用lambda表达式?

其实它的优点我感觉吧只有一点,那就是使代码更加简洁了,节省了开发时间看起来比较厉害点吧。。。

那它的缺点呢?

  • 就是造成了代码的可读性变差了,代码简洁了,但是也比较难懂了。
  • 不便于维护,加大了维护成本。
  • 还有就是因为它出现的版本较迟,可能会有一些不稳定的因数存在。

在学习lambda表达式之前先让我们看一种接口类型

函数式接口(@functionInterface)

在学习lambda之前我们要知道先了解一个概念:函数式接口

那么它是这么定义的呢?

即指在定义了一个抽象的接口中的方法有且只有一个的时候

那么让我们看下面的一段案例让我们可以更加深刻的理解

public interface test {
    void test(); 

    default void test1() {} //默认实现

    static void test2() {} //静态方法本身不用去重写

    String toString(); //Object实现
}

在上述的接口中方法涵盖了我们可能会误导我们,他看起来像是有四个方法,但是实际上只有一个方法,所以它仍让是一个函数式接口。

我已经在上述的注释中详细说明了一些方法

如果实在分辨不出来函数式接口,那么可以在接口上方使用
普歌 - lambda表达式详解
注解来帮助我们判断这个接口是否是函数式接口。

二、lambda的衍变

首先让我们回忆一下实现接口的过程中
首先我们在这里定义一个接口

//这里我们添加FunctionalInterface进行判断
@FunctionalInterface
interface interfaceLambda {
    void methodLambda();
}

通过继承实现

定义一个接口,一个抽象类继承,最后通过类实现

下面我们定义一个外部类

//定义实现类
class abstractLambda implements interfaceLambda {
    @Override
    public void methodLambda() {
        System.out.println("通过外部类实现接口");
    }
}

最后实例化进行实现

public class classLambda extends abstractLambda {
    public static void main(String[] args) {
        //    实现
        abstractLambda i = new abstractLambda();
        i.methodLambda();
    }
}

通过上面的代码我们虽然实现了接口,但是过程繁琐,代码冗余,下面让我们继续使用另外一种实现方式

成员外部类

public class classLambda {
    public static void main(String[] args) {
        //    实现
        abstractLambda i = new abstractLambda();
        i.methodLambda();
    }

    static class abstractLambda implements interfaceLambda {
        @Override
        public void methodLambda() {
            System.out.println("通过成员外部类实现接口");
        }
这种是将实现类放到了同一个类的里面,
相较于上边的通过单独创建一个类来实现方法,有些进步。

那么让我们继续往下看

匿名内部类

public class classLambda {
   public static void main(String[] args) {
       // 匿名内部类实现
        new interfaceLambda() {
           @Override
           public boolean methodLambda() {
               System.out.println("匿名内部类实现");
           }
       }.methodLambda();
   }
}

匿名内部类已经把代码简化到极致了,但是机智的大佬们感觉这样做还是是缺点东西,于是lambda表达式就横空出世了。

三、走进lambda表达式

使用条件

  1. 必须实现函数式接口

基本构成

  1. 参数列表
    方法的实现部分,要求实现接口中的方法参数部分一致,包括参数数量和类型
  2. 箭头
  3. 方法体
    让我们看一张图来加深对它的组成印象普歌 - lambda表达式详解

使用

这里我用代码演示,在该大家细细的解释一下

public class classLambda {
    public static void main(String[] args) {
        //lambda表达式表示
        interfaceLambda i = () -> {
            System.out.println("lambda表达式实现");};
        i1.methodLambda();
    }
}

通过与上面匿名内部类的比较我们可以看到,使用lambda表达式省去了很多代码,但是却增加了阅读难度。

上一篇:大数协python训练营打卡笔记Task06


下一篇:Java笔记