Java StreamAPIについて

2025 年 7 月 30 日 by sumikawah

1. Stream APIとは

Stream APIは、Java 8で導入された、コレクション操作のための機能です。リストや配列などのデータを「流れ(ストリーム)」として扱い、フィルター処理、変換、集計などの処理を簡潔に記述できるようになります。

特に、ラムダ式との組み合わせによって、可読性が高く、柔軟なコードが書けるようになります。

Stream APIは、主に以下の3つの処理ステップで構成されます。

  1. 生成(Creation)
     例:Listなどのコレクションから.stream()で生成します。
  2. 中間処理(Intermediate Operation)
     例:filter(), map(), sorted() などを使ってデータを加工します。
  3. 終端処理(Terminal Operation)
     例:collect(), forEach(), count() などを使用して、最終的な処理を行います。

2. Stream APIのメリット

  1. 簡潔な記述が可能
     filter, map, collectなどの操作を組み合わせることで、読みやすいコードになります。
  2. 関数型スタイルを採用
     副作用の少ない設計となっており、バグの発生を抑えやすくなります。
  3. 処理の再利用
     ラムダ式やメソッド参照を使って、テスト可能で再利用性の高いコードが書けます。

3.デメリット・注意点

  1. デバッグがしづらい
     メソッドチェーンの中でのバグの特定が難しい場合があります。
  2. 複雑な処理をStreamで記述すると可読性が落ちる
     無理にStreamを使いすぎると、かえって処理の意図が見えにくくなり、コードの保守が難しくなる場合があります。
  3. 状態の変更には不向き
     外部変数の変更など、副作用を伴う処理は避けるべきです。

4. for文との比較

以下の処理をfor文とStreamで比較してみます。

  • 処理内容:リストから
    1.  null や 空文字 を除外
    2.  3文字以上の名前だけに絞る
    3.  名前を大文字に変換
    4.  アルファベット順にソートして表示

for文での実装

List<String> names = Arrays.asList("Taro", "", "Hanako", null, "Ai", "Ichiro");
List<String> cleaned = new ArrayList<>();

for (String name : names) {
    if (name != null && !name.isEmpty()) {
        if (name.length() >= 3) {
            cleaned.add(name.toUpperCase());
        }
    }
}
Collections.sort(cleaned);
for (String name : cleaned) {
    System.out.println(name);
}

Streamでの実装

List<String> names = Arrays.asList("Taro", "", "Hanako", null, "Ai", "Ichiro");

names.stream()
     .filter(Objects::nonNull)
     .filter(s -> !s.isEmpty())
     .filter(s -> s.length() >= 3)
     .map(String::toUpperCase)
     .sorted()
     .forEach(System.out::println);
同じ処理であっても、Streamを使うことで記述が簡潔になり、処理の意図が明確になります。

5. まとめ

Stream APIは、Javaにおける新しいコレクション処理のスタイルを提供する機能です。for文と比較して、可読性や保守性の面で優れており、特にデータ加工やフィルタ処理において強力な力を発揮します。ただし、Streamを過剰に使用すると読みにくいコードになる可能性もあるため、用途に応じて適切に使い分けることが重要です。

タグ:

TrackBack