java中体验Lambda表达式

先来个例子:

我们调用个接口,可以使用下面3种方式!这里主要说一下Lambda表达式。主要就是简化代码。

//接口
public interface Eatable {
    void eat();
}

public class EatableDemo {
    public static void main(String[] args) {
        //写一个类,实现接口中的方法
        Eatable e= new EarableImpl();
        UserEatable(e);

        //匿名内部类
        UserEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("加油");
            }
        });

        //lambda 表达式
        UserEatable(()->{
            System.out.println("你好");
        });
    }
//以接口为形参的方法
    private static void UserEatable(Eatable e){
        e.eat();
    }

Lambda表达式的组成:

():里面没有内容,可以看成是方法形式参数为空,如果不为空的话,就直接写进去。

->:用箭头指向后面要做的事情。

{}:包含一段代码,我们称之为代码块,可以看作方法体中的内容。

格式:

(形式参数)->{代码块};

Lambda表达式的省略模式:

省略规则:

1.参数类型可以省略,但是多个参数的情况下,要不就都省略,要不就别省略。别只省略一个。

2.如果参数有且只有一个,那么小括号可以省略。

3.如果代码块的语句只有一条,可以省略大括号和番号,甚至是return。

Lambda表达式使用的注意事项:

1.使用Lambda必须要有接口,接口中必须只能有一个方法!

2.必须要有上下文环境,才能推导出Lambda对应的接口。

根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.printIn("Lambda表达式")).start();

根据局部变量的赋值得知Lambda对应的接口:Runnable=()->System.out.printIn("Lambda表达式");

Lambda表达式和匿名内部类的区别:

所需类型不同:

匿名内部类:可以是接口,可以是抽象类,可以是具体类

Lambda表达式:只能是接口

使用限制不同:

如果接口中仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类

如果接口中多于一个抽象方法,只能使用匿名内部类,不能使用Lambda表达式

实现原理不同:

匿名内部类:编译后会产生一个单独的.class字节码文件

Lambda表达式:编译后,没有单独生成.class字节码文件。对应的字节码会在运行的时候动态生成。

猜你喜欢

转载自blog.csdn.net/weixin_44126152/article/details/106456689