1. 程式人生 > >Java 8 新特性———方法引用和構造器引用

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

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
}