Java 8 新特性———方法引用和构造器引用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/IPOmonkey/article/details/82967996

1.方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符“::” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况:

  1. 对象::实例方法
  2. 类::静态方法
  3. 类::实例方法

例如:

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
}

猜你喜欢

转载自blog.csdn.net/IPOmonkey/article/details/82967996