次のコード スニペットを考えてみましょう:
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
Consumer インターフェイスに従って、これは void accept(T t); として定義されます。したがって、consumption メソッドが String を返すため、lambda3 の割り当てに戸惑うかもしれません。驚くべきことに、lambda4 も割り当てられています。
このシナリオは、Java のメソッド参照の柔軟な設計に起因します。これにより、メソッドを直接呼び出すのと同じ方法で、メソッドを関数インターフェイスに適応させることができます。言い換えれば、値を返す任意のメソッドを呼び出し、戻り値を無視できます。
ラムダ式には 2 つの形式があります:
式 s -> s はステートメントではないため、 s には void 互換性がありません。ただし、s ->;メソッド呼び出しはステートメントであるため、s.toString() を使用できます。
ステートメントとして使用できる式 (Java 言語仕様 §14.8 に従って) には、次のものが含まれます。
形式 (arg) -> であることに注意することが重要です。 methodReturningVoid(arg) は、値の互換性がない唯一の式形式です。
以上が戻り値のある Java メソッド参照が「Consumer」インターフェイスで機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。