方法引用
如果Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。 方法引用和构造器引用可以让 Lambda表达式的代码块更加简洁。方法引用和构造器引用都需要使用两个英文冒号。
类方法引用
import java.util.function.Function; /** * 本示例演示方法引用 */ public class StaticMethodRef { public static void main(String[] args) { //将String.valueOf()方法当做了函数式接口中抽象方法的实现 Function<Integer,String> function = String::valueOf; System.out.println(function.apply(100)); } }
实例方法引用
package cn.bytecollege.ref; import java.util.function.Function; /** * 本示例演示方法引用 */ public class InstanceMethodRef { public static void main(String[] args) { Function<Integer,String> function = integer -> { return integer.toString(); }; //Object的toString()充当了抽象方法的实现 function = Object::toString; } }
构造器引用
package cn.bytecollege.ref; import java.util.function.Supplier; public class ConstructorMethodRef { public static void main(String[] args) { Supplier<StringBuilder> supplier = ()->{return new StringBuilder();}; //引用了String的构造器 supplier = StringBuilder::new; } }
Lambda表达式和匿名内部类的联系和区别(掌握)
-
Lambda 表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部 类的成员变量(包括实例变量和类变量)。
-
Lambda 表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认 方法。
-
匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现 所有的抽象方法即可;但 Lambda 表达式只能为函数式接口创建实例。
-
匿名内部类可以为抽象类甚至普通类创建实例;但 Lambda 表达式只能为函数式接口创建实例。
-
匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但 Lambda 表达式的代 码块不允许调用接口中定义的默认方法