Java StreamAPIについて
2025 年 7 月 30 日 by sumikawah1. Stream APIとは
Stream APIは、Java 8で導入された、コレクション操作のための機能です。リストや配列などのデータを「流れ(ストリーム)」として扱い、フィルター処理、変換、集計などの処理を簡潔に記述できるようになります。
特に、ラムダ式との組み合わせによって、可読性が高く、柔軟なコードが書けるようになります。
Stream APIは、主に以下の3つの処理ステップで構成されます。
- 生成(Creation)
例:List
などのコレクションから.stream()
で生成します。 - 中間処理(Intermediate Operation)
例:filter()
,map()
,sorted()
などを使ってデータを加工します。 - 終端処理(Terminal Operation)
例:collect()
,forEach()
,count()
などを使用して、最終的な処理を行います。
2. Stream APIのメリット
- 簡潔な記述が可能
filter
,map
,collect
などの操作を組み合わせることで、読みやすいコードになります。 - 関数型スタイルを採用
副作用の少ない設計となっており、バグの発生を抑えやすくなります。 - 処理の再利用
ラムダ式やメソッド参照を使って、テスト可能で再利用性の高いコードが書けます。
3.デメリット・注意点
- デバッグがしづらい
メソッドチェーンの中でのバグの特定が難しい場合があります。 - 複雑な処理をStreamで記述すると可読性が落ちる
無理にStreamを使いすぎると、かえって処理の意図が見えにくくなり、コードの保守が難しくなる場合があります。 - 状態の変更には不向き
外部変数の変更など、副作用を伴う処理は避けるべきです。
4. for文との比較
以下の処理をfor文とStreamで比較してみます。
- 処理内容:リストから
- null や 空文字 を除外
- 3文字以上の名前だけに絞る
- 名前を大文字に変換
- アルファベット順にソートして表示
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を過剰に使用すると読みにくいコードになる可能性もあるため、用途に応じて適切に使い分けることが重要です。
タグ: Java