メソッド参照はラムダラッパーのオーバーヘッドをスキップしますか?将来的にはそうなるのでしょうか?
時々...ラムダ式は既存のメソッドを呼び出すだけです。これらの場合、既存のメソッドを名前で参照する方が明確な場合がよくあります。メソッド参照により、これを行うことができます。これらは、既に名前を持っているメソッドのコンパクトで読みやすいラムダ式です。
いくつかの理由から、メソッド参照構文よりもラムダ構文の方が好きです。
ラムダはより明確です
Oracleの主張にもかかわらず、メソッド参照構文があいまいであるため、ラムダ構文はオブジェクトメソッド参照の速記より読みやすいと思います。
Bar::foo
xのクラスで静的な1引数のメソッドを呼び出してxを渡しますか?
x -> Bar.foo(x)
または、xで引数のないインスタンスメソッドを呼び出していますか?
x -> x.foo()
メソッド参照構文は、どちらの代わりにもなります。コードが実際に行っていることを隠します。
ラムダはより安全です
クラスメソッドとしてBar :: fooを参照し、Barが後で同じ名前のインスタンスメソッドを追加した場合(またはその逆)、コードはコンパイルされなくなります。
ラムダを一貫して使用できます
任意の関数をラムダでラップできます。そのため、どこでも同じ構文を一貫して使用できます。メソッド参照構文は、プリミティブ配列を取得または返すメソッド、チェックされた例外をスローするメソッド、またはインスタンスと静的メソッドとして使用されるメソッド名が同じメソッドでは機能しません(メソッド参照構文が呼び出されるメソッドについて曖昧だからです) 。同じ数の引数を持つメソッドをオーバーロードした場合は機能しませんが、とにかくそれを行うべきではないため(Josh Blochの項目41を参照)、メソッド参照に対してそれを保持することはできません。
結論
パフォーマンスの低下がない場合は、IDEで警告をオフにし、メソッド参照をコードに散在させることなくラムダ構文を一貫して使用したいと思います。
PS
ここでもそこでもありませんが、私の夢では、オブジェクトメソッドの参照は次のように見え、ラムダラッパーなしでメソッドに対してinvoke-dynamicを直接適用します。
_.foo()
.map(_.acceptValue())
:間違っていなければ、これはScala構文に非常によく似ています。たぶん、あなたは間違った言語を使用しようとしているだけかもしれません。
System.out::println
てforEach()
います...?