1. ホーム
  2. java

[解決済み] Java 8では、関数型インターフェースは何に使われるのですか?

2022-04-22 22:14:09

質問事項

Java 8の新しい用語、quot;functional interface"に出会いました。この用語の使い方は ラムダ式 .

Java 8 にはいくつかの組み込み関数インターフェイスが用意されており、任意の関数インターフェイスを定義したい場合、そのインターフェイスを使用するために @FunctionalInterface アノテーションを使用します。このアノテーションを使うと、インターフェースに単一のメソッドだけを宣言することができます。

例えば

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

との連携以外にJava 8でどれだけ役に立つか? ラムダ式 ?

(質問 ここで は、私が質問した内容とは異なります。ラムダ式で作業しているときに、なぜ関数型インターフェースが必要なのか、という質問です。私の質問は、ラムダ式で使う以外に関数型インターフェースはどのような使い方があるのか、というものです)。

どのように解決するのですか?

@FunctionalInterface アノテーションは、コンパイル時にコードをチェックするのに便利です。の他に複数のメソッドを持つことはできません。 static , default のメソッドをオーバーライドする抽象的なメソッドと Object を使用します。 @FunctionalInterface または機能インターフェイスとして使用される他のインターフェイス。

しかし、このアノテーションがなくてもラムダを使用することができますし、メソッドをオーバーライドする際も、このアノテーションがなくても使用できます。 @Override アノテーションを使用します。

docsより

関数型インターフェースは、ちょうど1つの抽象的なメソッドを持ちます。デフォルトの メソッドには実装があるので、抽象的ではありません。もし、あるインターフェイス のパブリックメソッドの一つをオーバーライドする抽象メソッドを宣言しています。 java.lang.Objectの場合、これもインターフェイスにカウントされません。 抽象的なメソッドの数は、インターフェイスの実装のいずれもが java.lang.Objectまたはその他の実装を持つ。

これは が使用できます。 をラムダ式で表現しています。

public interface Foo {
  public void doSomething();
}

これは 使用不可 をラムダ式で使用します。

public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

しかし、これでは コンパイルエラー :

@FunctionalInterface
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

無効な '@FunctionalInterface' アノテーション; Foo は関数型ではありません。 インターフェース