概述
-
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。
-
方法引用提供了一种引用而不执行方法的方式,它需要有兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。
-
当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。
-
方法引用是一种更加紧凑、易懂的Lambda表达式,注意其中方法引用的操作符是双冒号“::”
方法引用
-
对象::方法名
1 public class Employee { 2 3 private String name; 4 private String age; 5 6 public Employee() { 7 this.name = "hmz"; 8 this.age = "23"; 9 } 10 11 public Employee(String name, String age) { 12 this.name = name; 13 this.age = age; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 public String getAge() { 25 return age; 26 } 27 28 public void setAge(String age) { 29 this.age = age; 30 } 31 32 @Override 33 public String toString() { 34 return "Employee{" + 35 "name='" + name + '\'' + 36 ", age='" + age + '\'' + 37 '}'; 38 } 39 40 }
1 public static void main(String[] args) { 2 Employee employee = new Employee(); 3 Supplier<String> supplier2 = employee::getAge; 4 String age = supplier2.get(); 5 System.out.println(age); 6 }
-
类::静态方法名
-
类::实例方法名
-
Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
-
若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method
1 BiPredicate<String, String> bp = (x, y) -> x.equals(y); 2 BiPredicate<String, String> bp2 = String::equals;
构造器引用
-
ClassName::new
BiFunction<String, String, Employee> bf = Employee::new; Employee employee = bf.apply("www", "22"); System.out.println(employee);
-
需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
数组引用
- Type::new
1 Function<Integer, String[]> function = String[]::new; 2 String[] strings = function.apply(10); 3 System.out.println(strings.length);