Java 8 の機能的インターフェースの定義は、次のように述べています。
関数型インターフェイスは、明示的に宣言された抽象メソッドを 1 つだけ 持つインターフェイスとして定義されます。(インターフェイスには抽象化されていないデフォルト メソッドが含まれる場合があるため、修飾が必要です。) これが、関数型インターフェイスが単一抽象 メソッド (SAM)インターフェイスと呼ばれていた理由です。この用語は、今でも時々見られます。
では、どうしてこうなったのでしょうか:
List<Double> temperature =
new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);
sort
メソッドList
は次のとおりです。
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
そして、ラムダ式は次のように述べています。
ラムダ式は機能インターフェースに割り当て可能であるべきです
このComparator
インターフェースには、 および で注釈が付けられた 2 つの抽象メソッドがcompare
ありequals
ます@FunctionalInterface
。これは、抽象メソッドが 1 つしかない関数型インタフェースの定義に違反していませんか?