Java 8 メソッド参照
メソッド参照は、メソッドの名前を使ってメソッドを指し示します。
メソッド参照を使用すると、言語の構造をよりコンパクトで簡潔にし、冗長なコードを減らすことができます。
メソッド参照はコロン2つ(::)を使用します。:: 。
以下では、Carクラスに4つのメソッドを定義して、Javaにおける4種類の異なるメソッド参照を区別する例とします。
package com.サンプル.main;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
class Car {
//Supplier は JDK 1.8 のインターフェースで、ここではラムダと一緒に使用されています。
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 です。例は次のとおりです。
final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car ); -
静的メソッド参照:その構文は Class::static_method です。例は次のとおりです。
cars.forEach( Car::collide ); -
特定のクラスの任意のオブジェクトのメソッド参照:その構文は Class::method です。例は次のとおりです。
cars.forEach( Car::repair ); -
特定のオブジェクトのメソッド参照:その構文は instance::method です。例は次のとおりです。
final Car police = Car.create( Car::new ); cars.forEach( police::follow );
メソッド参照の例
Java8Tester.java ファイルに次のコードを入力します:
Java8Tester.java ファイル
import java.util.List;
import java.util.ArrayList;
public class Java8Tester {
public static void main(String args[]){
List<String> names = new ArrayList();
names.add("Google");
names.add("サンプル");
names.add("Taobao");
names.add("Baidu");
names.add("Sina");
names.forEach(System.out::println);
}
}
この例では、System.out::println メソッドを静的メソッドとして参照します。
上記のスクリプトを実行すると、出力結果は次のとおりです。
$ javac Java8Tester.java $ java Java8Tester Google サンプル Taobao Baidu Sina
その他の拡張
Java 8 新機能