Lambda的主要作用是替代匿名内部类,更为简洁。
Lambda表达式的目标类型必须是函数式接口,函数式接口就是只包含一个抽象方法的接口(该接口可以包含多个默认方法、类方法)。
Lambda表达式只能为函数式接口创建对象,Lambda表达式只能实现一个方法,故其所实现的接口只能有一个抽象方法。
匿名内部类的实现方式如下:
public class Test { public static void main(String args[]) { // 匿名内部类实现Computation接口 Computation adder = new Computation(){ // 实现add()方法 public int add(int a, int b) { return a+b; } }; System.out.println(adder.add(5, 6)); } } interface Computation { public abstract int add(int a, int b); }
Lambda表达式的实现方法如下:
public class Test { public static void main(String args[]) {// Lambda表达式实现Computation接口 Computation adder = (a,b) -> a+b; System.out.println(adder.add(5, 6)); } } interface Computation { public abstract int add(int a, int b); }
Lambda表达式由三部分组成,以Computation adder = (a,b) -> a+b; 为例
形参列表。如上述中的(a,b),允许省略形参类型。
箭头 ->。
代码块,如上a+b。 若代码块只有一句可以省略花括号{}, 只有一条return语句,也可以省略return。
Computation adder = (a,b) -> a+b;等价于Computation adder = (int a, int b) -> {return (a+b);};
Lambda表达式与匿名内部类的主要区别如下:
匿名内部类可以为任意接口创建实例,不管改接口包含多少抽象方法,而Lambda表达式只能为函数式接口(只包含一个抽象方法)创建实例。
匿名内部类可以抽象类普通类创建实例。
匿名内部类实现抽象方法的方法体允许调用接口中的默认方法;Lambda表达式的代码块不允许。