Java 8 メソッド参照

Java 8 新特性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 新特性Java 8 新機能

その他の拡張