■ 導入:Stream APIでコードを劇的に簡潔化
Java 8以降で導入された Stream API は、リストや配列の操作を「宣言的」「関数型スタイル」で記述できる強力な仕組みです。
従来の for
ループを使った処理に比べて、コード量を大幅に削減し、バグを防止 できます。
本記事では、List
操作を中心に、Stream APIの実践サンプルを多数紹介します。
■ 基本構文:Streamの流れを理解する
Streamの基本構成は以下の3ステップです。
イメージ:
■ サンプル①:条件でフィルタリングする
例えば「偶数だけを抽出する」処理は、以下のように書けます。
処理内容 | コード例 | 説明 |
---|---|---|
偶数のみ抽出 | filter(n -> n % 2 == 0) | 条件に一致する要素だけを残す |
■ サンプル②:要素を変換する(map)
全ての要素を2倍にする変換も簡単です。
処理内容 | コード例 | 出力例 |
---|---|---|
2倍変換 | map(n -> n * 2) | [2, 4, 6, 8] |
■ サンプル③:ソート・並び替え
文字列リストをアルファベット順にソートする例です。
降順にする場合は:
処理内容 | メソッド | 説明 |
---|---|---|
昇順ソート | sorted() | 自然順序(A→Z, 1→9) |
降順ソート | sorted(Comparator.reverseOrder()) | 逆順に並び替え |
■ サンプル④:重複を除去する(distinct)
処理内容 | メソッド | 効果 |
---|---|---|
重複削除 | distinct() | 同一要素を1つにまとめる |
■ サンプル⑤:合計・平均・最大値を求める
数値リストの集計処理も簡単です。
処理 | メソッド | 結果型 |
---|---|---|
合計 | sum() | int |
平均 | average() | OptionalDouble |
最大 | max() | OptionalInt |
■ サンプル⑥:複数条件の処理(filter + map)
処理順序 | 内容 |
---|---|
① | Aで始まる要素のみ抽出 |
② | すべて大文字に変換 |
③ | 新しいリストに収集 |
■ サンプル⑦:グルーピング(groupingBy)
Stream APIでは、SQLのように「グループ化」も可能です。
処理内容 | メソッド | 結果 |
---|---|---|
長さごとにグループ化 | groupingBy(String::length) | {3=[Tom, Ken], 4=[John]} |
■ サンプル⑧:並列処理で高速化(parallelStream)
大量データを高速処理したい場合は parallelStream()
を使います。
ただし、順序が保証されない ため、結果の順序が重要な場合は通常の stream()
を使用しましょう。
■ Stream APIを使うメリットまとめ
メリット | 内容 |
---|---|
コードの簡潔化 | for文やif文のネストを削減 |
可読性向上 | 処理の流れが直感的に理解できる |
パフォーマンス | 並列処理で大量データにも対応 |
安全性 | NullPointerExceptionを防ぎやすい |
■ まとめ:Stream APIを使いこなして効率化
Stream APIは一度慣れてしまえば、リスト処理を格段に楽にしてくれます。
特にJava 11以降では、ラムダ式やメソッド参照との相性も良く、業務アプリのコード品質を底上げできます。