コンストラクタ参照を使用すると、指定したクラスのオブジェクトを生成する。
関数型インタフェースのメソッドの引数は、生成するオブジェクトのコンストラクタの引数となる。また、関数型インタフェースのメソッドの戻り値が、生成するオブジェクトの型である必要がある。
クラス名::new
コンストラクタを指すためにnewを使用することが、メソッド参照と異なる
public class ConstructorReferenceDemo {
@FunctionalInterface
interface Function {
T apply();
}
public ConstructorReferenceDemo() {
// ラムダ式を使用して、Dateインスタンスを生成
Function func1 = () -> new Date();
Date date1 = func1.apply();
// コンストラクタ参照を使用して、Dateインスタンスを生成
Function func2 = Date::new;
Date date2 = func2.apply();
}
public static void main(String… args) {
new MethodReferenceDemo();
}
}
引数がある場合でも、同様に使用できる。
public class ConstructorReferenceDemo {
@FunctionalInterface
interface OneArgFunction {
T apply(S s);
}
public ConstructorReferenceDemo() {
// ラムダ式を使用して、Doubleインスタンスを生成
OneArgFunction func1 = x -> new Double(x);
Double number1 = func1.apply(10.0);
// コンストラクタ変数を私用して、Doubleインスタンスを生成
OneArgFunction func2 = Double::new;
Double number2 = func2.apply(20.0);
}
public static void main(String… args) {
new MethodReferenceDemo();
}
}
コンストラクタの特殊な使い方として、配列の生成がある。
たとえば、Stringクラスの配列を生成は次のようになる。
public class ConstructorReferenceDemo {
@FunctionalInterface
interface OneArgFunction {
T apply(S s);
}
public ConstructorReferenceDemo() {
// ラムダ式を使用した配列の生成
OneArgFunction func1 = n -> new String[n];
String[] texts1 = func1.apply(10);
// コンストラクタ参照を使用した配列の生成
OneArgFunction func2 = String[]::new;
String[] texts2 = func2.apply(10);
}
public static void main(String… args) {
new ConstructorReferenceDemo();
}
}
関数型インタフェースのメソッドの引数は生成する配列のサイズに使用されるため、intもしくはIntegerクラスにする必要がある。
関数型インタフェースのメソッドの戻り値は、生成する配列となる。