【Java学習|豆知識】Java Stream API入門:Stream.count()を使ったスマートな要素数集計

1. 導入:なぜStream.count()が重要なのか

Java開発において、リストやセットの要素数を数えることは日常茶飯事です。従来はコレクションのsize()メソッドを使用してきましたが、Stream APIを活用すれば「特定の条件を満たす要素だけを数える」という処理が非常に直感的に記述できます。ビジネスロジックで「アクティブなユーザー数のみ抽出」といったフィルタリングと集計を同時に行いたい際、コードの可読性と保守性を劇的に向上させます。

2. 基礎知識:Stream APIにおけるカウントの仕組み

Stream APIの count() メソッドは、ストリーム内の要素数を long 型で返す終端操作です。重要なポイントは、count() を呼び出すとストリームが「消費」されるという点です。一度カウントを行うと、そのストリームは再利用できません。また、count() は単純な全件数取得だけでなく、filter() と組み合わせることで、「条件に合致する要素数」を効率的に算出できる点が最大の強みです。

3. 実装・解決策

要素を数える手順はシンプルです。
1. コレクションから stream() を生成する。
2. 必要に応じて filter() で条件を絞り込む。
3. count() を呼び出して結果を取得する。
この一連の流れにより、ループ文(forやwhile)や一時的なカウンター変数を用意する必要がなくなり、宣言的なコードが実現できます。

4. サンプルプログラム

以下は、リスト内のデータから特定の条件(例:100以上の数値)をカウントする実用的な例です。

import java.util.Arrays;
import java.util.List;

public class StreamCountExample {
    public static void main(String[] args) {
        // 数値リストの準備
        List numbers = Arrays.asList(50, 120, 30, 200, 80, 150);

        // 1. 全要素数を取得
        long totalCount = numbers.stream().count();
        System.out.println("全要素数: " + totalCount);

        // 2. フィルタリングして条件に合う要素数を取得
        // 100以上の数値のみをカウントする
        long filteredCount = numbers.stream()
                                    .filter(n -> n >= 100)
                                    .count();
        
        System.out.println("100以上の数値の個数: " + filteredCount);
    }
}

5. 応用・注意点

現場で活用する際の重要な注意点が2つあります。

一つ目は、パフォーマンスへの配慮です。リストのようなコレクションであれば size() を直接呼ぶのが最も高速です。Stream APIは便利ですが、単純な全件取得のためにわざわざストリームを生成するとオーバーヘッドが発生します。条件検索が必要な場合にのみ Stream を利用しましょう。

二つ目は、戻り値の型です。count() は int ではなく long を返します。大規模なデータセットを扱う場合、int の範囲(約21億)を超える可能性があるため、long で受け取る習慣をつけておくことが、将来的なバグを防ぐ鍵となります。また、Java 21以降の Sequenced Collections を利用している場合でも、ストリーム化の手順は変わらないため、この手法は普遍的に利用可能です。

コメント

タイトルとURLをコピーしました