1. 序章

このクイックチュートリアルでは、StreamAPIを使用して整数の合計を計算するさまざまな方法を検討します。

簡単にするために、例では整数を使用します。 ただし、longsとdoublesにも同じ方法を適用できます。

2. Stream.reduce()を使用する

Stream.reduce()は、がストリームの要素の削減を実行する端末操作です。

二項演算子(アキュムレータ)をストリーム内の各要素に適用します。最初のオペランドは前のアプリケーションの戻り値であり、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番目の方法は、 collect()端末操作を使用することです。

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .collect(Collectors.summingInt(Integer::intValue));

同様に、 Collectors クラスは、longとdoubleの合計を計算するための summaryLong()メソッドと summaryDouble()メソッドをそれぞれ提供します。

4. IntStream.sum()を使用する

Stream APIは、 mapToInt()中間操作を提供します。これにより、ストリームがIntStreamオブジェクトに変換されます。

このメソッドは、変換を行うために使用するマッパーをパラメーターとして受け取り、 sum()メソッドを呼び出して、ストリームの要素の合計を計算できます。

それをどのように使用できるかの簡単な例を見てみましょう:

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
  .mapToInt(Integer::intValue)
  .sum();

同様に、 mapToLong()メソッドと mapToDouble()メソッドを使用して、それぞれlongとdoubleの合計を計算できます。

5. Stream#sumMapの使用

の値の合計を計算するには地図データ構造、最初に作成します値からのストリームその地図。 次に、以前に使用した方法の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. Stream#sumStringの使用

いくつかの整数を含むStringオブジェクトがあると仮定しましょう。

これらの整数の合計を計算するには、最初にでその文字列を配列に変換する必要があります。次に、で非整数要素を除外し、、最後に変換する必要があります。その配列の残りの要素を数値に変換します。

これらすべての手順を実際に見てみましょう。

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. 結論

この記事では、StreamAPIを使用して整数のリストの合計を計算する方法のいくつかの方法について説明しました。 また、これらのメソッドを使用して、オブジェクトのリストの特定のフィールドの値の合計、マップの値の合計、および特定のStringオブジェクト内の数値を計算しました。

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