メソッドの使用に関して質問がありますFunction.identity()
。
次のコードを想像してください。
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.
Function.identity()
の代わりにを使用する (またはその逆) 理由はありますかstr->str
。2 番目のオプションの方が読みやすいと思います (もちろん好みの問題です)。しかし、どちらか一方を優先する「本当の」理由はあるのでしょうか。
ベストアンサー1
現在の JRE 実装では、Function.identity()
は常に同じインスタンスを返しますが、の各出現はidentifier -> identifier
独自のインスタンスを作成するだけでなく、異なる実装クラスも持っています。詳細については、ここ。
その理由は、コンパイラがそのラムダ式の自明な本体を保持する合成メソッド ( の場合x->x
、 と同等return identifier;
) を生成し、このメソッドを呼び出す関数インターフェースの実装を作成するようにランタイムに指示するためです。そのため、ランタイムは異なるターゲット メソッドのみを認識し、現在の実装ではメソッドを分析して特定のメソッドが同等かどうかを調べません。
したがって、Function.identity()
の代わりにを使用するとx -> x
メモリをいくらか節約できるかもしれませんが、 の方がx -> x
よりも読みやすいと本当に思うのであれば、その点を決定の要因にすべきではありませんFunction.identity()
。
また、デバッグ情報を有効にしてコンパイルすると、合成メソッドに、ラムダ式を含むソース コード行を指す行デバッグ属性が含まれるため、Function
デバッグ中に特定のインスタンスのソースを見つけることができる可能性があります。対照的に、操作のデバッグ中に によって返されたインスタンスに遭遇した場合Function.identity()
、誰がそのメソッドを呼び出してインスタンスを操作に渡したかはわかりません。