Like Share Discussion Bookmark Smile

J.J. Huang   2020-04-04   Java   瀏覽次數:

Java 8 | 方法引用

方法引用使得開發者可以直接引用現存的方法、Java類的構造方法或者實例對象。方法引用和Lambda表達式配合使用,使得Java類的構造方法看起來緊湊而簡潔,沒有很多複雜的模板代碼。

方法引用使用一對冒號::

下面,我們在Car類中定義了4個方法作為例子來區分Java4種不同方法的引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class Car {
public static Car create( final Supplier< Car > supplier ) {
return supplier.get();
}

public static void collide( final Car car ) {
System.out.println( "Collided " + car.toString() );
}

public void follow( final Car another ) {
System.out.println( "Following the " + another.toString() );
}

public void repair() {
System.out.println( "Repaired " + this.toString() );
}
}

第一種方法引用的類型是構造器引用,語法是Class::new,或者更一般的形式:Class<T>::new。注意:這個構造器沒有參數。

1
2
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );

第二種方法引用的類型是靜態方法引用,語法是Class::static_method。注意:這個方法接受一個Car類型的參數。

1
cars.forEach( Car::collide );

第三種方法引用的類型是某個類的成員方法的引用,語法是Class::method,注意,這個方法沒有定義入參:

1
cars.forEach( Car::repair );

第四種方法引用的類型是某個實例對象的成員方法的引用,語法是instance::method。注意:這個方法接受一個Car類型的參數:

1
2
final Car police = Car.create( Car::new );
cars.forEach( police::follow );

運行上述例子,可以在控制台看到如下輸出(Car實例可能不同):

1
2
3
Collided com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
Repaired com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
Following the com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d

註:更詳細的內容,可以參考官方文件

方法引用實例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.List;
import java.util.ArrayList;

public class Java8Tester {
public static void main(String args[]){
List names = new ArrayList();

names.add("Google");
names.add("Morose");
names.add("Dog");
names.add("GitLab");

names.forEach(System.out::println);
}
}

輸出的結果為:

1
2
3
4
Google
Morose
Dog
GitLab

註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南