Java 8 新特性———方法引用和構造器引用
阿新 • • 發佈:2019-02-05
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
}