次のコードがコンパイルされないのはなぜですか。
Consumer con = (s) -> System.out::println;
それは言います
この式のターゲットタイプは、機能的なインターフェイスである必要があります
consumerは機能的なインターフェイスですが。以下は問題なく動作します。
Consumer con2 = (s) -> {System.out.println(s);};
これはメソッド参照であるため、使用方法は少し異なります。
Consumer<String> c = System.out::println;
コンシューマが取る引数(s
)は、引き続きprintln
メソッドに渡されます。
here は、これに関するOracleのチュートリアルです。
Consumer con = (s) -> System.out::println;
ここで、あなたはSystem.out.println()
を呼び出すことを試みていますメソッド参照 in Java 8.メソッドを参照するときラムダ式では、このようなものでなければなりません、
_Consumer con = System.out::println;
_
s
メソッドを呼び出すためにprintln
は実際には必要ありません。メソッド参照がそれを処理します。この_::
_演算子は、パラメーターを指定してprintln
メソッドを呼び出し、その名前を指定しないことを意味します。
しかし、これを行うと、
Consumer con2 = (s) -> {System.out.println(s);};
s
の内容を明示的にprintlnするようにラムダ式に指示していますが、これは技術的には完璧であるため、コンパイルエラーは発生しません。