頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?

【Java SE8】関数型インターフェースとは

関数型インターフェースとは、抽象メソッドを1つ持っているインターフェースのこと。
Objectクラスからオーバーライドしたメソッドや、defaultメソッド、staticメソッドの実装が含まれていても
抽象メソッドが1つ定義されていれば、関数型インターフェースとして認識される。
関数型インターフェースとして定義出来ているかどうかを確認するには「@FunctionalInterface」を用いる。

関数型インターフェースとして定義できている例1)

抽象メソッドが1つのみのパターン。

@FunctionalInterface
public interface IF {
    public void Ex1(String str);
}

関数型インターフェースとして定義できている例2)

抽象メソッド、ObjectクラスのからオーバーライドしたtoString()メソッド、defaultメソッドの組合せ。

@FunctionalInterface
public interface IF {
    public void Ex1(String str);
    public String toString();
    default void Ex2() {}
}

関数型インターフェースとして定義できていない例1)

抽象メソッドが1つもないパターン。

@FunctionalInterface
public interface IF {    //ここでコンパイルエラー。
    public String toString();
    default void Ex2() {}
}

関数型インターフェースとして定義できていない例2)

抽象メソッドを2つ以上定義したパターン。

@FunctionalInterface
public interface IF {    //ここでコンパイルエラー。
    public void Ex1(String str);
    public void Ex2(String str);

}

関数型インターフェースの実装

@FunctionalInterface
interface IF {
    void add(int x,int y);
}

//普通に実装するとこうなる。
@Override
public void add(int x,int y){
  System.out.println(x + y);
}

//ラムダ式で書くとこうなる。
IF IF1 = (x,y) -> System.out.println(x + y);
IF1.add(5,3);