ホームページ  >  記事  >  Java  >  戻り値のある Java メソッド参照が「Consumer」インターフェイスで機能するのはなぜですか?

戻り値のある Java メソッド参照が「Consumer」インターフェイスで機能するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-22 18:04:12510ブラウズ

Why Does a Java Method Reference with a Return Value Work with the `Consumer` Interface?

戻り値の型を持つ Java メソッド参照がコンシューマ インターフェイスと一致する理由

問題

次のコード スニペットを考えてみましょう:

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 つの形式があります:

  1. (引数) ->式: 式が値に評価される場合、互換性のある値。
  2. (args) -> { ステートメント* }: コード パスが値を返そうとしない場合、Void と互換性があります。

式 s -> s はステートメントではないため、 s には void 互換性がありません。ただし、s ->;メソッド呼び出しはステートメントであるため、s.toString() を使用できます。

互換形式

ステートメントとして使用できる式 (Java 言語仕様 §14.8 に従って) には、次のものが含まれます。

  • メソッド呼び出し
  • インクリメント/デクリメント演算子
  • 代入
  • クラス インスタンス作成式

制限

形式 (arg) -> であることに注意することが重要です。 methodReturningVoid(arg) は、値の互換性がない唯一の式形式です。

以上が戻り値のある Java メソッド参照が「Consumer」インターフェイスで機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。