Javaストリームを使用した数値の合計

1. 前書き

このクイックチュートリアルでは、https://www.baeldung.com/java-8-streams-introduction [Stream API] *を使用して、*整数の合計を計算する*さまざまな方法を示します。
簡単にするために、例では整数を使用します。 ただし、longsおよびdoubleにも同じメソッドを適用できます。

2. _Stream.reduce()_の使用

  • _Stream.reduce()_は、*ストリームの要素の削減を実行する*中間操作です。

    ストリーム内の各要素に2項演算子(アキュムレータ)を適用します。最初のオペランドは前のアプリケーションの戻り値で、2番目のオペランドは現在のストリーム要素です。
    _reduce()_メソッドを使用する最初の方法では、アキュムレーター関数は2つの_Integer_値を追加して_Integer_値を返すラムダ式です。
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, (a, b) -> a + b);
同様に、すでに*既存のJavaメソッド*を使用できます:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, Integer::sum);
または、カスタムメソッドを定義して使用できます。
public class ArithmeticUtils {

    public static int add(int a, int b) {
        return a + b;
    }
}
次に、この関数をパラメーターとして_reduce()_メソッドに渡すことができます。
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .reduce(0, ArithmeticUtils::add);

3. _Stream.collect()_の使用

整数のリストの合計を計算する2番目の方法は、_https://www.baeldung.com/java-8-collectors [collect()] _ terminal操作を使用することです。
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .collect(Collectors.summingInt(Integer::intValue));
同様に、_Collectors_クラスは、_summingLong()_および_summingDouble()_メソッドを提供して、それぞれlongとdoubleの合計を計算します。

4. _IntStream.sum()_を使用する

Stream APIは、ストリームを* _IntStream_オブジェクト*に変換する* _mapToInt()_ *中間操作を提供します。
このメソッドは、変換を行うために使用するパラメーターとしてマッパーを受け取り、_sum()_メソッドを呼び出して、ストリームの要素の合計を計算できます。
使用方法の簡単な例を見てみましょう。
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .mapToInt(Integer::intValue)
  .sum();
同様に、_mapToLong()_メソッドと_mapToDouble()_メソッドを使用して、それぞれlongとdoubleの合計を計算できます。

5. _Map_で_Stream#sum_を使用する

_Map <Object、Integer> _データ構造の値の合計を計算するには、まずその_Map_の値から*ストリームを作成し、次に以前に使用したメソッドの1つを適用します。
たとえば、_IntStream.sum()_を使用して:
Integer sum = map.values()
  .stream()
  .mapToInt(Integer::valueOf)
  .sum();

6. オブジェクトでの_Stream#sum_の使用

オブジェクトのリストがあり、これらのオブジェクトの*特定のフィールドのすべての値の合計*を計算したいと考えてみましょう。
例えば:
public class Item {

    private int id;
    private Integer price;

    public Item(int id, Integer price) {
        this.id = id;
        this.price = price;
    }

    // Standard getters and setters
}
次に、次のリストのすべてのアイテムの合計価格を計算するとします。
Item item1 = new Item(1, 10);
Item item2 = new Item(2, 15);
Item item3 = new Item(3, 25);
Item item4 = new Item(4, 40);

List<Item> items = Arrays.asList(item1, item2, item3, item4);
この場合、前の例で示したメソッドを使用して合計を計算するには、「_ map()_メソッドを呼び出す」**ストリームを整数のストリームに変換する必要があります*。
その結果、_Stream.reduce()、Stream.collect()、およびIntStream.sum()_を使用して合計を計算できます。
Integer sum = items.stream()
  .map(x -> x.getPrice())
  .reduce(0, ArithmeticUtils::add);
Integer sum = items.stream()
  .map(x -> x.getPrice())
  .reduce(0, Integer::sum);
Integer sum = items.stream()
  .map(item -> item.getPrice())
  .reduce(0, (a, b) -> a + b);
Integer sum = items.stream()
  .map(x -> x.getPrice())
  .collect(Collectors.summingInt(Integer::intValue));
items.stream()
  .mapToInt(x -> x.getPrice())
  .sum();

7. _String_で_Stream#sum_を使用する

いくつかの整数を含む_String_オブジェクトがあるとします。
これらの整数の合計を計算するには、まず、その_String_を_Array_ *に変換する必要があり、次に*非整数要素をフィルターで除外する*必要があり、最後に、その配列の*残りの要素を変換する*数字に。
これらのすべての手順を実際に見てみましょう。
String string = "Item1 10 Item2 25 Item3 30 Item4 45";

Integer sum = Arrays.stream(string.split(" "))
    .filter((s) -> s.matches("\\d+"))
    .mapToInt(Integer::valueOf)
    .sum();

8. 結論

このチュートリアルでは、Stream APIを使用して整数のリストの合計を計算する方法のいくつかの方法を見ました。 また、これらのメソッドを使用して、オブジェクトのリストの「特定のフィールドの値の合計」、a mapの値の合計、および特定の_String_オブジェクト内の数値を計算しました。
いつものように、完全なコードはGitHubで入手できます。