Java Streamでの業務処理マニュアル:モダンな書き方と性能の限界
ベースラインはJava 17/21/25です。Stream APIの基本仕様は安定していますが、書き方や適用範囲は更新が必要です。
1. 結果の収集
不変の結果が必要な場合はStream.toList()を使えます。可変リストが必要な場合は、明示的にArrayListへ収集してください。すべてのコレクターが可変集合を返すとは限りません。
2. よくある落とし穴
Streamは一度しか消費できず、終端操作の後は再利用できません。toMapはkeyが重複すると例外を発生させ、groupingByは余分なメモリを消費します。null値と順序の扱いは事前に定義してください。
3. デフォルトで並列化しない
parallelStreamは共通のForkJoinPoolを共有するため、ブロッキングI/O、トランザクション操作、ThreadLocalに依存する処理、厳密な順序が必要な業務には適しません。並列化する前に、データ量、タスクの粒度、スレッド競合、下流側の処理能力を測定してください。
4. 適用基本原则
Streamは純粋なデータ変換の表現に適していますが、複雑な副作用を隠す用途には適しません。map内でデータベースアクセスやメッセージ送信、共有コレクションの変更を行わないようにしてください。性能が重要な処理経路では、直感ではなくJMHで測定してください。
5. チェックリスト
短路操作、プリミティブStream、例外処理、Optionalのネスト、コレクションの可変性、戻り値の順序を確認してください。関数型であることを追求するより、可読性を優先してください。