Lambda 表达式
Lambda 表达式支持代码块作为参数。其作用主要是简化匿名内部类的操作(一定情况下(接口中只有一个抽象函数)可以代替匿名内部类)。
Lambda组成部分:
(形参列表)-> { 逻辑语句 }
1.形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至可以连形参列表的圆括号都不带。
2.箭头(->)。必须通过英文的划线号与大于号组成。
3.代码块。如果代码只包含一条语句,则可以省略花括号{}。Lambda代码块只有一条return语句,如果省略 return,它可以自动将这条语句返回。
Lambda表达式与函数式接口:
函数式接口:只包含一个抽象方法的接口。 @FunctionalInterface 用来注释函数式接口。
即lambda表达式只能包含一个抽象方法(所实现接口中只有一个抽象方法)。
Lambda表达式与匿名内部类的联系与区别:
相同点:
1.Lambda表达式与匿名内部类一样,可以直接访问“effectively final”的局部变量,以及外部类的成员变量。
2.Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。
不同点:
1.匿名内部类可以为任意接口创建实例(不管有多少个抽象方法),Lambda表达式只能为函数是接口创建实例。
2.匿名内部类可以为抽象类甚至普通类创建实例,而lambda表达式只能为函数式表达式创建实例。
注意:
Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。
匿名内部类实现的抽象方法的方法体允许调用接口中的默认方法,但Lambda表达式的代码块不允许调用接口中定义的默认方法。