「Stream API」タグアーカイブ

Java Streamsで文字列リストを加工・整形する便利テクニック

Java 8 以降で利用できる Stream API は、文字列リストの加工・整形に非常に便利です。
filter / map / collect を組み合わせるだけで、複雑な処理もスッキリ書けるようになります。

この記事では、**業務システムで頻出する「文字列リストの加工」**を中心に、すぐに使えるサンプルをまとめています。


✔ よくある文字列リストの処理

業務プログラムの中で、以下のようなケースはよくあります。

  • 空文字・null を除去したい

  • 前後の空白を trim したい

  • 大文字/小文字変換をしたい

  • 任意の条件で絞り込みたい

  • 区切り文字にまとめたい(CSV・ログなど)

こうした処理は Stream API を使うと 1 行で書ける ことが多いです。


1. 空文字・null を除去する 


2. 全要素を大文字 or 小文字に変換する


3. 特定の文字を含む要素だけ抽出する

部分一致の他に、
startsWith / endsWith / 正規表現 なども活用できます。


4. trim+フィルタ+整形をまとめて 1 行で

業務コードで頻発する「整形 → フィルタ → 出力」を 1 行で書く例です。


5. 重複要素を除外する(distinct)


6. 文字列リストを区切り文字で join する(CSV など)

改行やタブ区切りにも応用できます。


7. リスト内の文字列長でソートする(Comparator)

降順にしたい場合:


8. 正規表現で加工する(replaceAll 等)


9. Stream API を使うメリットまとめ

✔ コードが短く読みやすい

for文で数十行になる処理が、Stream だと数行に。

✔ null などの例外ケースを潰しやすい

filter → map → collect の流れが明確で安全。

✔ 並列処理(parallelStream)にも切り替えやすい

データ量が多い場合に性能改善も期待できる。


まとめ

Stream API を使うと、文字列リストの加工・整形が圧倒的にシンプルになります。

  • null / 空白除去

  • 大文字・小文字変換

  • 条件フィルタ

  • 重複削除

  • join で CSV 形式へ変換

  • ソート

これらは業務アプリで頻出するため、覚えておくとコード品質・保守性が確実に上がります。

Java 8以上でリストをマージ・変換・フィルタリングするプロ向け実践術

✅ はじめに:Java 8以降の開発では「リスト操作力」が問われる

Java 8以降、Stream APIの登場によってListの操作が劇的に効率化されました。
しかし──

✅ addAllやfor文と混在してコードが読みづらくなる
✅ mapとflatMapを使い分けられない
✅ filterの順序ミスでパフォーマンス劣化
✅ null対策が甘く実行時例外が発生
✅ collectの最適な書き方がわからない

…といった悩みを抱える開発者は少なくありません。

本記事では、**「プロが実務で使うリスト処理の実践術」**を、マージ・変換・フィルタリングに焦点を当てて徹底解説します。


✅ Stream APIの基本構造

✅ Streamは元のリストを壊さない(非破壊的)
✅ 中間操作は評価されず蓄積 → 終端操作で初めて実行
✅ メソッドチェーンで可読性UP


✅ 1. リストをマージ(結合)する3つの実践パターン

❗ 従来の書き方(非推奨)

✅ ① Stream.concat()

✅ ② flatMapを使った複数リスト統合

✅ リストを動的に渡す場合にも有効


✅ 2. リストの変換(map・flatMap)実践術

✅ map(1対1変換)

✅ flatMap(1対多変換に最適)

✅ 「map + 非Stream返却」ならmap
✅ 「map + Stream返却」ならflatMap


✅ 3. フィルタリング(filter)応用パターン

✅ 基本

✅ 複数条件

✅ Optional併用(null安全)


✅ 4. プロが多用する応用操作

操作用途サンプル
distinct重複削除.distinct()
sorted並び替え.sorted(Comparator.comparing(User::getAge))
groupingByグループ化Collectors.groupingBy(User::getDepartment)
collectingAndThen集約後処理.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList))

✅ Before / Afterで理解:IDの重複を削って並べる

❌ 従来(冗長)

✅ Stream版(たった1行)


✅ 5. パフォーマンス注意点

NGOK理由
filter後にmapmap後にfilterマッピングが無駄になる
distinct前にmapmap後にdistinct重複を早く削る
flatMap多用必要時のみネストが深いと重い
無闇なparallel()データ量が少ないと逆効果

✅ 最後に:Stream APIは「読みやすく・壊さない」が正解

✅ 冗長なfor文はStreamで置き換え
✅ mapとflatMapは「1対1」「1対多」で使い分け
✅ filterは前処理に最適
✅ Optional併用でnull対策
✅ groupByやdistinctで実務効率化

「使える」から「読みやすい」「安全」「再現性のある」コードへ。

Java:Stream APIのparallelStream()で並列処理を簡単に実現する方法

🔷 はじめに

JavaのStream APIは、コレクション操作を簡潔に記述できる便利な仕組みですが、
parallelStream()を使うことで マルチスレッド処理(並列処理) を手軽に実現できます。

この記事では、parallelStream()の基本的な使い方から、注意点・パフォーマンスの最適化方法までをわかりやすく解説します。


🔷 StreamとparallelStreamの違い

種類説明特徴
stream()通常の逐次処理1スレッドで順次実行される
parallelStream()並列処理ForkJoinPoolを使って複数スレッドで分割実行される

上記のparallelStream()では、スレッドごとに要素を分割して処理するため、
出力順が異なる(順不同になる)点に注意が必要です。


🔷 並列処理の仕組み(ForkJoinPool)

parallelStream()は内部的に ForkJoinPool(フォーク・ジョイン・プール)を使用します。
デフォルトでは、Runtime.getRuntime().availableProcessors() の値(CPUコア数)に応じてスレッド数が自動決定されます。

例えば、4コアCPUの場合は最大4スレッドで同時実行されます。


🔷 実行例:リストの重い処理を並列化する

以下の例では、重い計算を伴う処理を並列実行して速度を比較します。

結果例:

逐次処理時間:5000ms
並列処理時間:1500ms

CPUコア数にもよりますが、並列処理では約3倍の高速化が期待できます。


🔷 並列処理時の注意点

注意点内容
スレッド安全性共有リソースを操作すると競合が発生する可能性あり
出力順forEach()は順序が保証されない(順序を保つにはforEachOrdered()を使用)
外部API呼び出し同時実行でAPI制限に抵触する可能性があるため注意
numbers.parallelStream()
.forEachOrdered(System.out::println); // 並列でも順序維持

🔷 並列処理の最適化テクニック

  1. 処理が軽い場合は使わない

    • 並列化のオーバーヘッドが大きく、逆に遅くなる場合があります。

  2. データ量が多い処理に限定する

    • 数千件以上の要素を扱う場合に効果的。

  3. カスタムスレッド数を指定

    • これで並列スレッド数を8に固定できます。


🔷 parallelStream()を使うべきケース

CPUバウンド処理(計算中心)
データが多い場合
スレッド安全な処理のみを行う場合

I/Oバウンド処理(ファイル操作・DBアクセス)は非推奨です。
並列化よりも非同期I/O(CompletableFutureなど)を使うほうが効率的です。


🔷 まとめ

項目内容
メリット複雑なスレッド処理を書かずに並列化できる
デメリット順序保証がない・スレッド安全性に注意
向いている処理CPU負荷の高いループ・数値計算・マッピング処理
非推奨の処理I/O、同期が必要な共有データ操作

parallelStream()は数行で並列化を実現できる強力なツールですが、
適切な場面で使うことが重要です。
CPUをフル活用して処理時間を短縮したい場面で、ぜひ活用してみてください。

Java Stream API入門:リスト操作を効率化する実用サンプル集

■ 導入: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以降では、ラムダ式やメソッド参照との相性も良く、業務アプリのコード品質を底上げできます。