今回も前回に引き続き、Projet Lambdaのラムダ式以外の言語仕様変更について紹介していきます。

 今回取り上げる言語仕様の変更点を以下に示しました。

  • コンストラクタ参照
  • デフォルトメソッド
  • インタフェースでのstaticメソッド

 特にデフォルトメソッドはインタフェースの根幹を変更するような、大きな変更になります。

コンストラクタ参照

 前回、メソッド参照を紹介しましたが、コンストラクタ参照もメソッド参照の一種です。

 メソッド参照がメソッドを指すのに対し、コンストラクタ参照はコンストラクタを指します。そして、コンストラクタ参照を使用すると、指定したクラスのオブジェクトを生成します。

 このため、関数型インタフェースのメソッドの引数は、生成するオブジェクトのコンストラクタの引数となります。また、関数型インタフェースのメソッドの戻り値が、生成するオブジェクトの型である必要があります。

 コンストラクタ参照の構文を以下に示します。

リスト1 コンストラクタ参照の構文

    クラス名::new

 

 コンストラクタを指すためにnewを使用することが、メソッド参照と異なる部分です。

 コンストラクタ参照もメソッド参照と同じような使い方になります。

リスト2 コンストラクタ参照の使用例

public class ConstructorReferenceDemo {
    @FunctionalInterface
    interface Function<T> {
        T apply();
    }

    public ConstructorReferenceDemo() {
        // ラムダ式を使用して、Dateインスタンスを生成
        Function<Date> func1 = () -> new Date();
        Date date1 = func1.apply();

        // コンストラクタ参照を使用して、Dateインスタンスを生成
        Function<Date> func2 = Date::new;
        Date date2 = func2.apply();
    }

    public static void main(String... args) {
        new MethodReferenceDemo();
    }
}

 

 青字で記述したラムダ式ではDateオブジェクトを生成しています。これをコンストラクタ参照で記述したものが赤字の部分です。