1.方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符“::” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况:
- 对象::实例方法
- 类::静态方法
- 类::实例方法
例如:
x -> System.out.println(x);
等同于:
System.out::println;
例如:
BinaryOperator<Double> bo = (x, y) -> Math.pow(x,y);
等同于
BinaryOperator<Double> bo = Math.pow;
例如
Compare( (x, y) -> x.equals(y), "abcdef", "abcdef")
等同于
Compare( String::equals, "abc", "abc")
注意:当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时,ClassName::MethodName。
@Test
public void test1(){
PrintStream ps = System.out;
Consumer<String> con1 = (str) -> ps.println(str);
con1.accept("Hello World!");
Consumer<String> con2 = ps::println;
con2.accept("Hello Java8!");
Consumer<String> con3 = System.out::println;
}
2.构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
例如:
Function<Integer, MyClass> fun = n -> new MyClass(n);
等同于
Function<Integer, MyClass> fun = MyClass::new;
//构造器引用
@Test
public void test7(){
Function<String, Employee> fun = Employee::new;
BiFunction<String, Integer, Employee> fun2 = Employee::new;
}
3.数组引用
格式:type[]::new
例如:
Function<Integer, Integer[]> fun = n -> new Integer[n];
等同于
Function<Integer, Integer[]> fun = Integer[]::new;
@Test
public void test6(){
Supplier<Employee> sup = () -> new Employee();
System.out.println(sup.get());// 10
System.out.println("------------------------------------");
Supplier<Employee> sup2 = Employee::new;
System.out.println(sup2.get());// 20
}