web-dev-qa-db-ja.com

Java 8の関数型インターフェースに1つの抽象メソッドがあるのはなぜですか?

Java 8でわかるように、関数型インターフェースの概念が導入されています。関数型インターフェースには1つのabstractメソッドがあり、いくつかのデフォルトまたは静的メソッドが可能です。

しかし、なぜ関数型インターフェースには1つの抽象メソッドしかないのでしょうか。インターフェイスに複数の抽象メソッドがある場合、これが関数型インターフェイスではないのはなぜですか?

20

Lambda関数を容易にするために、Single Abstract Method Interfaceとも呼ばれる関数型インターフェースが導入されました。ラムダ関数は1つのメソッドの実装しか提供できないため、関数型インターフェースには1つの抽象メソッドのみが必要です。詳細については ここを参照

Edit->ここで注目に値するのは、関数型インターフェースがインターフェースにデフォルトの実装を持つことができるということです。上記のリンクで、実装の詳細を確認できます。

21
AdityaKeyal

関数型インターフェースを使用すると、オブジェクトを関数であるかのように呼び出すことができます。これにより、名詞(オブジェクト)ではなく動詞(関数)をプログラムに渡すことができます。関数型インターフェースの実装は、run、execute、perform、apply、またはその他の一般的な動詞などの名前を使用して、他のメソッドと同様に、明確に定義された単一のアクションを実行します。[1]

  1. ScalaおよびClojureの関数型プログラミングパターン。
5
Sayat Satybald

Javaが2つの抽象メソッドを持つことを許可した場合、両方のメソッドの実装を提供するにはラムダ式が必要になります。メソッドを呼び出すと、それらからどちらのメソッドを呼び出すかがわからないためです。 2つの抽象メソッド。実装されていないメソッドを呼び出すことができます。たとえば、

もしJavaは、この種の機能インターフェースを許可していたでしょう

@FunctionalInterface
interface MyInterface {
    void display();
    void display(int x, int y);
}

その場合、以下を実装することは不可能でした。

public class LambdaExpression {
    public static void main(String[] args) {
        MyInterface ref = () -> System.out.print("It is display from sout");
        ref.display(2, 3);

    }
}

Display(int x、int y)が実装されていないため、エラーが発生します。そのため、関数型インターフェースは単一の抽象メソッドインターフェースです。

1
sn.anurag