jdk1.8新特性:Lambda表达式

要了解Lambda表达式,我们先来说说函数式接口
函数式接口:接口中只有一个抽象方法(有默认方法和静态方法不影响)
Lambda表达式就是为了解决函数式接口而诞生的,可以先看一个例子来了解
现在我们要实现下面接口的drive功能,我们能怎么做呢?

interface Drive {
     void drive();
}
1.通过一般类实现接口来重写该方法
class TestDrive implements Drive{
    @Override
    public void drive() {
        System.out.println("类实现接口:  drive car");
    }
}

但是在实际的应用场景中,我们往往不会这么做,而是写一个匿名内部类

2.通过匿名内部类重写该方法
Drive drive = new Drive() {
     @Override
     public void drive() {
         System.out.println("匿名内部类: drive car");
     }
 };

或许匿名内部类是以前常用方法,现在Lambda横空出世,下面我们先来看看使用Lambda如何实现这个功能需求

3.通过Lambda表达式
Drive drive = () -> System.out.println("Lambda表达式: drive car");

通过这个例子我们可以明显知道Lambda的优点和缺点
优点:1.比较简洁 2.不会生成class文件
缺点:只能针对函数式接口,如果接口中有多个方法就不能使用

下面我们来具体看看Lambda表达式的语法

语法

1.Lambda表示式主体是 : () -> {}
小括号是参数列表,花括号是代码块。
我们前面已经说过了Lambda表达式针对的是函数式接口,所以该接口最主要的就是那个抽象方法,而Lambda表示就跳过接口,直接去写这个抽象方法。可以对应一下,()就是抽象方法的参数列表,{}就是方法体。
这点是最重要的,也是最常用的。
我们来举个例子,现在我要起一个线程,我们知道线程可以通过给Thread构造传入一个Runnable实例,我们以前在这里都是写一个匿名内部类,而现在我们就可以这样写

 Thread thread = new Thread(() -> {
            System.out.println("Lambda");
 });

() 就对应我们的run()的形参列表,由于我们不用给run方法传参,所以在这块我们只用写一个空括号,->是连接的,必须要写,它是Lambda的一个标志,花括号中的内容就是我们run方法中写的内容。是不是很简单。
学会了这一点我们基本上可以写出来所有的Lambda表示式。但是我们还要了解其他的一些语法规范。
2.当形参列表只有一个参数的时候,()小括号可以省略,来看一个demo
我们先定义一个有一个参数抽象方法的接口

interface Test {
    void test(String name);
}

然后我们写一个测试类

public class TestLambda_1 {
    public static void main(String[] args) {
        Test _test = name -> {
            System.out.println("一个参数时候可以去掉小括号"+name);
        };
        _test.test("!!!");
    }
}

这时Lambda的语法,知道就行。
3.当函数体(代码块)也就是{}里面包括的语句只有一句时,可以省略花括号{}。
在这里插入图片描述
但是的情况有一个特例,就是当花括号中只有一句代码但是这句代码是return语句时,这种情况是错误的,我们修改自定义的接口,使他有返回值。

interface Test {
    String test(String name);
}

我们用第三条规则试试
在这里插入图片描述
为什么是就有这个特例呢?看看第四条就知道了
4.当抽象函数有返回值时,且只有一条语句,在第3条规则的基础上可以继续省略return
在这里插入图片描述
知道了这几点,就可以熟练的用Lambda表示式去替换那些需要函数式接口new 出来的匿名内部类了。

猜你喜欢

转载自blog.csdn.net/weixin_42220532/article/details/88868102