StreamAPIを使用してBigDecimalsを追加します
1. 概要
通常、データのコレクションを処理するためにJava StreamAPIを使用します。
優れた機能の1つは、sum操作などの数値ストリームの操作のサポートです。 ただし、この方法ですべての数値タイプを処理できるわけではありません。
このチュートリアルでは、BigDecimalのような数値のストリームに対してsum操作を実行する方法を説明します。
2. 通常、ストリームを合計する方法
Stream APIは、次のような数値のストリームを提供します。 IntStream、DoubleStream、 と
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でから入手できます。