整数のリストを合計したい。次のように動作しますが、構文が正しくありません。コードを最適化できますか?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> i
個人的には非常に明確です。ええ、はい、値は自動的にボックス化解除されることを知っておく必要がありますが、Java 5以降はそうです...
foo(int i)
書き込みを行いませんfoo(myInteger.intValue());
(または少なくとも私は期待していません!!)。Integer::intValue
もっと明白だと私は同意しますが、ここでも同じことが当てはまると思います。人々は一度それを学べばそれで終わりです:-)。それは魔法の難読化のようではありません。
i -> i
ノーオペレーションのように見え、概念的にはノーオペレーションです。確かに、内部でInteger.intValue()
呼び出されますが、内部でさらに深くなると、そのメソッドはインライン化されて、ソースコードのように動作しないようになります。Integer::intValue
バイトコードに合成メソッドを作成しないというボーナスポイントがありますが、ソースコードをどのように編成するかについての決定を促進するものではありません。
mapToLong
マップに設定できる値によっては、オーバーフローを回避するために使用したい場合があります。