質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

8020閲覧

【Stream API】forEachでのbreak処理について

citra

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/04/24 06:18

java

1for(String t : tList){ 2 for(String e : eList){ 3 if(条件①){ 4 処理① 5 break; 6 } else if(条件②){ 7 処理② 8 break; 9 } else { 10 処理③ 11 break; 12 } 13 } 14}

上記拡張for文で記述していた処理をStream APIを使用しての記述に修正しました。

java

1tStream.forEach(t -> { 2 eStream.forEach(e -> { 3 if(条件①){ 4 処理① 5 } else if(条件②){ 6 処理② 7 break; 8 } else { 9 処理③ 10 break; 11 } 12 }); 13});

しかし、Stream APIの場合、break処理の個所にてエラー(break は、ループおよびスイッチの外側で使用できません)となってしまいます。
調べた限りだと、Stream APIではbreakが実行できないと見受けられたのですが、
何か対処する方法ありましたらご教示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

このコード例だとif-else if-elseの全てでbreakしているので先頭要素しか見ていないと思うのですが・・・

  1. break

java9以降ならtakeWhileが使えます。
takeWhileは引数に条件を渡すとその条件を満たす限り先頭から要素を取得します。
breakならば、「!(break条件)」を引数に渡すことで同じ結果が得られます。
ただ、条件で処理を分けるのならさらに分岐を書かなくてはならないので、拡張for文のままの方が見やすいとは思います。

  1. continue

何もせずにcontinueするならfilterで除いてしまえばいいのですが、一部だけ処理をするという場合は難しいと思います。

投稿2018/04/24 06:44

YamakawaJunichi

総合スコア630

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

何か対処する方法ありましたらご教示ください

それよりもまず先に「何故Streamに変更したいのかの目的をもう少し明確化」した方がよいと思います。

自分の場合は基本的に列に対して変換・集約などの「典型的な加工パターン」に従ってなんらかの計算結果を求める場合によくStreamを用います。言い換えると「前段から流れてきた要素を流れ作業で何か計算して後段へ引き渡す」パイプラインのイメージで論理を組み上げるのに用います。

しかしforEachってなんでしょう?何かの計算をしてそれを後段へ渡すものではありませんね。処理1, 処理2って書いておられますがそれは多分「副作用」ですよね。

詳しい処理内容が書かれてないのではっきりとは言えませんが、もし処理1, 処理2,...の内容が外側のスコープにあるコレクションに加工したデータを追加するなんてやっておられるなら、Streamの書き方として「違う」気がします。そういものは普通collectを用いて集約処理に置き換えるのが典型的なStreamの使い方になると思います。

もしかしたら「for文つかうのは古くてStream使いましょう」みたいなキャッチコピーをどこかでご覧になったのではないでしょうか?多分このキャッチコピーのいいたいことは「何かの処理をする」という意識から「値を計算する」という関数プログラミング的な意識に切り替えましょうという意味合いが込められているような気がします。そのあたりもう少し考えてみてはいかがでしょう?

投稿2018/04/24 08:18

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/04/24 11:49 編集

> 「何かの処理をする」という意識から「値を計算する」という関数プログラミング的な意識に切り替えましょうという意味合いが込められている 旧来のfor文からStream APIへの移行は、まさにKSwordOfHasteさんが仰るような発想転換(パラダイム・シフト)が重要だと思います。 このような発想転換なしに見た目だけfor文をStream APIに置き換えて対処するのは、百害あって一利なしと考える派です。(みたいなポエム https://qiita.com/yohhoy/items/99c5004dbb2f990566b3
KSwordOfHaste

2018/04/24 13:28

記事拝見しました。単にこの記事へリンクできれればよかったですね。 余談ですが、yohhoyさんの記事なのでどちらかというと並列処理への言及の方により興味を魅かれました...
guest

0

Stream使う必要ないのでは…

投稿2018/04/24 07:10

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Stream APIではbreakが実行できないと見受けられたのですが、

ではなく、後のコードだと、無名関数のなかでbreakが書かれてるからエラーになってるだけかと。

投稿2018/04/24 06:51

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそもbreakはfor,while,switchの中でしか使えないので…

投稿2018/04/24 07:06

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問