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

