Java の関数型インターフェイスは、抽象メソッドを 1 つだけ含むインターフェイスです。主な目的は、ラムダ式とメソッド参照で使用することです。
1 つの抽象メソッドの存在が唯一の条件であるため、関数型インターフェイスには
それらについては詳しく説明しません。最も頻繁に使用されるのは、 Consumer<T>、Function<T,R>、Predicate<T>、Supplier<T>、UnaryOperator<T>およびそれらのBi形式であることに注意してください。詳細については、ドキュメント ページ:パッケージ java.util.functionを参照してください。
default
メソッドを含めることもできますstatic
。@FunctionalInterface アノテーションを関数インターフェースに追加できます。これは必須ではありませんが、このアノテーションが存在する場合、抽象メソッドが 1 つより多いか少ない場合、コードはコンパイルされません。@FunctionalInterface を追加することをお勧めします。これにより、誰かがインターフェイスに新しい抽象メソッドを追加して機能しなくなることを心配することなく、ラムダ式でインターフェイスを使用できるようになります。Java には、 に格納された関数型インターフェイスが組み込まれていますjava.util.function
。
他に読むべきもの: |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
しかし、Java 言語仕様には、「インターフェイスは Object から継承せず、多くの同じメソッドを Object と暗黙的に宣言する」という微妙な点が 1 つあることがわかりました。これは、関数型インターフェイスには、クラスで定義された抽象メソッドを追加で含めることができることを意味しますObject
。以下のコードは有効であり、コンパイル エラーや実行時エラーは発生しません。
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
面接中は気をつけて!幸運を!
GO TO FULL VERSION