質問: ``` for(String t : tList){ for(String e : eList){ if(条件1){ 処理1 break; } else if(条件2){ 処理2 break; } else { 処理3 break; } } } ``` 上記拡張for文で記述していた処理をStream APIを使用しての記述に修正しました。 ``` tStream.forEach(t -> { eStream.forEach(e -> { if(条件1){ 処理1 } else if(条件2){ 処理2 break; } else { 処理3 break; } }); }); ``` しかし、Stream APIの場合、break処理の個所にてエラー(break は、ループおよびスイッチの外側で使用できません)となってしまいます。 調べた限りだと、Stream APIではbreakが実行できないと見受けられたのですが、 何か対処する方法ありましたらご教示ください。
回答: > > 何か対処する方法ありましたらご教示ください > > > それよりもまず先に「何故Streamに変更したいのかの目的をもう少し明確化」した方がよいと思います。 自分の場合は基本的に列に対して変換・集約などの「典型的な加工パターン」に従ってなんらかの計算結果を求める場合によくStreamを用います。言い換えると「前段から流れてきた要素を流れ作業で何か計算して後段へ引き渡す」パイプラインのイメージで論理を組み上げるのに用います。 しかしforEachってなんでしょう?何かの計算をしてそれを後段へ渡すものではありませんね。処理1, 処理2って書いておられますがそれは多分「副作用」ですよね。 詳しい処理内容が書かれてないのではっきりとは言えませんが、もし処理1, 処理2,...の内容が外側のスコープにあるコレクションに加工したデータを追加するなんてやっておられるなら、Streamの書き方として「違う」気がします。そういものは普通collectを用いて集約処理に置き換えるのが典型的なStreamの使い方になると思います。 もしかしたら「for文つかうのは古くてStream使いましょう」みたいなキャッチコピーをどこかでご覧になったのではないでしょうか?多分このキャッチコピーのいいたいことは「何かの処理をする」という意識から「値を計算する」という関数プログラミング的な意識に切り替えましょうという意味合いが込められているような気がします。そのあたりもう少し考えてみてはいかがでしょう?