Lambda式是使用及注意事项

  • Lambda表达式是Java8发布的最重要的新特性,允许将函数作为方法的参数,也就是说函数可以作为参数传递到方法中,它的优点可以使代码更加简洁,当然是用它的限制条件也很多,接下来一一给大家介绍。
Lambda表达式的格式:

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

  • 形式参数:如果有多个参数,参数之间必须用逗号隔开;
  • ->:有英文中划线和大于符号组成,固定写法;
  • 代码块:这里就是我们需要具体做的事情,可以把这里理解为我们之前创建方法的方法体;
使用Lambda的前提条件:
  • 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法。

用一个实例来说明下:

public class MainClass {
    public static void main(String[] args) {
        //使用匿名内部类来传参
        method(new Person() {
            @Override
            public void eat(String name) {
                System.out.println(name+"吃饭");
            }
        });
        //使用Lambda表达式传参
        method((name)->{
            System.out.println(name+"吃饭");
        });
    }
    public static void method(Person p){
        p.eat("张飞");
    }
}
interface Person{
    void eat(String name);
}
//结果为:
张飞吃饭
张飞吃饭
//可见匿名内部类的方法和Lambda表达式的方法的结果是一样的
  • 上面的代码中:有一个接口Person,而且里面仅有一个抽象方法,满足了前提条件,方发method()中的参数是Person,所以它实际需要的是一个实现类的对象,所以在main方法中调用method()方法的时候,可以有三种传参方式:
  1. 创建一个实现类来实现Person接口,然后创建该实现类的对象,最后将该对象作为参数传入;
  2. 使用匿名内部类(如上代码中所示);
  3. 使用Lambda表达式(如上代码中所示);
  • 其实,Lambda表达式的本质还是实现接口中的抽象方法,只不过换了一种样式,当然,底层也会发生一些改变,后文将介绍;
  • 这里示例的是一个带参无返回值的接口方法,我们也可以对无参无返回值,有参有返回值等类型进行操作,原理同上面一样,(形式参数的类型及数量与接口中的抽象方法参数列表对应,方法体中是它的具体需要实现的功能)。

这里大家可能会有疑问,Lambda表达式中怎么没有方法名呢?这里就需要告诉大家,Lambda表达式的存在是依赖于上下文环境的,怎么理解呢?比如说:

(name)->{ System.out.println(name+“吃饭”); }

单单将这个表达式放在代码中,它是会报错的,因为系统无法判断它是什么意思,如果改成:

Person p= (name)->{ System.out.println(name+“吃饭”); }

此时系统就可以理解Lambda表达式指的是接口中具体实现类;
也就是说你的代码中必须可以提供给可以推断出该方法名的线索,如本例中所示,Perso接口中只有一个抽象方法,所以Lambda的方法名也就可以确定了,那按照这个推理,参数的类型是不是也可以推理出来了呢?是的。
接下来,给大家介绍下Lambda中的省略模式:

Lambda中的省略模式:
  1. 参数类型可以省略。注意:要省略都都省略,不能多个参数,有的省略,而有的没省略参数类型,这样会报错;
  2. 如果参数仅有一个,小括号可以省略;
  3. 如果方法体只有一条语句,大括号及分号也可以省略,如果有return的话也需要省略
  • 所以上面的代码中关于Lambda表达式还可以简写成:
method(name->System.out.println(name+"吃饭");
能用Lambda表达式的,都可以使用匿名内部类类传参,那么,他们两又有什么区别呢?
  • 表示的类不同:
    匿名内部类可作为抽象类,具体类,匿名内部的的具体对象来作为参数传入
    Lambda表达式,只能是接口
  • 接口的条件限制:
    如果接口中仅有一条抽象方法,可以调用Lambda表达式,也可以使用匿名内部类
    如果接口中有多条抽象方法,这是就只能使用匿名内部类了
  • 底层实现不同:
    匿名内部类,编译之后会产生一个.class字节码文件
    Lambda表达式,编译之后没有生成单独的.class文件,对应的字节码文件会在运行时动态生成

以上就是关于Lambda表达式的一些介绍,谢谢浏览,不足之处,烦请指出。