整数のリストを考えます: List<Integer> numbers = Arrays.asList(1,2,3);
なぜ私はのようにそれらを合計することはできませんか:numbers.stream().sum();
?
代わりに、私はこれをしなければなりません。 numbers.stream().mapToInt(e -> e).sum();
私は知っているmapToInt
生産IntStream
、原始的な特殊化を。しかし、まだ私はそれを得ることはありません。なぜそれが整数を合計することはできませんか?私は、このリストには、整数と、コンパイラが同じことを行うことができるはずがあることを知っています。結局のところ、それは今、ラムダ式で型パラメータを推測することができます。
OK、整数はヌルと合計が失敗する可能性があります。しかし、私は出ていると、フィルタヌルの責任を取ることができます。
numbers.stream().filter(Objects::nonNull).sum();
なぜ私は整数のストリームを合計することはできませんか?
呼び出すstream()
には、List
あなたには、汎用取得するStream
任意の参照型だけでなく、数値型を扱うことができ、。これには、しても意味がありませんsum
上のメソッドをStream
、それが合計しても意味がありませんので、URL
S、Class
ES、Thread
S、またはその他の非数値参照型。
あなたは呼び出すことで要素を合計ことができreduce
:
numbers.stream().reduce(0, (a, b) -> a + b)
しかし、それはアンボクシングとボクシングの多くを伴うだろう。それはあなたがそれを持っているように変換することにより、それらを合計するのがベストだろうIntStream
に動作する、int
S、及び呼び出しsum()
(またはsummaryStatistics()
、カウント、平均、最大値、およびサムと一緒に分を含みます)。
あなたも使用することができますIntStream.of
し、一度も値をボクシング避けます。
IntStream.of(1, 2, 3).sum()