1. 概要

通常、データのコレクションを処理するためにJava StreamAPIを使用します。

優れた機能の1つは、sum操作などの数値ストリームの操作のサポートです。 ただし、この方法ですべての数値タイプを処理できるわけではありません。

このチュートリアルでは、BigDecimalのような数値のストリームに対してsum操作を実行する方法を説明します。

2. 通常、ストリームを合計する方法

Stream APIは、次のような数値のストリームを提供します。 IntStream、DoubleStream、 LongStream。

c 数値ストリームを再生することにより、これらがどのように機能するかを思い出してみましょう。 次に、 IntStream#sumを使用して合計を計算します。

IntStream intNumbers = IntStream.range(0, 3);
assertEquals(3, intNumbers.sum());

Doubleのリストから始めて同様のことを行うことができます。 ストリームを使用することにより、 mapToDouble を使用して、オブジェクトストリームからDoubleStreamに変換できます。

List<Double> doubleNumbers = Arrays.asList(23.48, 52.26, 13.5);
double result = doubleNumbers.stream()
    .mapToDouble(Double::doubleValue)
    .sum();
assertEquals(89.24, result, .1);

したがって、BigDecimal番号のコレクションを同じ方法で合計できると便利です。

残念ながら、BigDecimalStreamはありません。したがって、別のソリューションが必要です。

3. BigDecimal番号を追加するためのReduceの使用

sum に依存する代わりに、 Stream.reduce:を使用できます。

Stream<Integer> intNumbers = Stream.of(5, 1, 100);
int result = intNumbers.reduce(0, Integer::sum);
assertEquals(106, result);

これは、 BigDecimal を含む、論理的に一緒に追加できるすべてのもので機能します。

Stream<BigDecimal> bigDecimalNumber = 
  Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(11, result);

reduce メソッドは、次の2つのパラメーターを取ります。

  • Identity –は 0 と同等です–これは削減の開始値です
  • アキュムレータ関数–これまでの結果とストリームの次の要素の2つのパラメータを取ります

4. 結論

この記事では、数値Streamでいくつかの数値の合計を見つける方法について説明しました。 次に、代わりにreduceを使用する方法を発見しました。

reduce を使用すると、BigDecimal番号のコレクションを合計できます。 他のタイプにも適用できます。

いつものように、例のコードはGitHubから入手できます。