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

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

ただいまの
回答率

87.37%

Java SE8 Streamについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 817

score 14

Java SE8 Goldの勉強をしているのですが、問題を解いていて疑問に思ったことがあります。
ある問題では、次のコートについて、「コンパイルは成功するが、実行するとハングとなる」が正解とされています。

Predicate<? super String> p = s -> s.startsWith("g");
Stream<String> st1 = Stream.generate(() -> "orange");
Stream<String> st2 = Stream.generate(() -> "gold"));
System.out.print(st1.anyMatch(p) + " ");
System.out.println(st2.allMatch(p));

理由は、generate()メソッドはlimit()などで終了しないと無限にストリームが生成されるためとのことです。

しかし、別の問題では、次のコードは「実行時エラー(IllegalStateException例外がスロー)」が正解とされています。

Predicate<? super String> f = s -> s.length() > 3;
Stream<String> stream = Stream.iterate("x", s -> s + s);
boolean a = stream.noneMatch(f);
boolean b = stream.anyMatch(f);
System.out.println(a + " " + b);

理由は、同じStreamで終端操作を2回行っているためとのことです。
このコードについても、1つ目のコード同様、iterate()メソッドは無限にストリームを生成するため、「コンパイルは成功するが、実行するとハング」するが正解となるかと思います。(選択肢にもあります)。

違いが分かりません。素人のため、すごく単純な勘違いがあるかもしれませんが、どうかご教授お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2019/09/28 23:31

    1つ目のコードの最後の行をまちがえていませんか?

    キャンセル

回答 3

checkベストアンサー

0

ハングするかどうかと、例外が発生するかどうかでは、論点がまるっきり違うことに気付いてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/28 23:47

    指摘及び回答いただきありがとうございます。
    おっしゃる通りです。
    ハングすることと実行時エラーすることとはまるっきり違うという点に気づかなかった自分がとても恥ずかしいです。

    ただとてもスッキリしました。
    ありがとうございます。

    キャンセル

0

anyMatch、allMatch、noneMatchは、評価が定まるまでストリームを舐めます。

boolean anyMatch​(Predicate<? super T> predicate)

このストリームのいずれかの要素が指定された述語に一致するかどうかを返します。 すべての要素で述語を評価するとは限りません(結果を決定するのに必要でない場合)。 ストリームが空の場合、falseが返され、述語は評価されません。
これは短絡終端操作です。

引用元: Stream (Java SE 10 & JDK 10 ) 太字は引用者によるもの。

1つ目のコード同様、iterate()メソッドは無限にストリームを生成するため

評価が定まった時点で処理が打ち切られるので、問題無いのです。

import java.util.stream.Stream;

class Main {
    public static void main(String[] args) {
        Stream<String> stream = Stream.iterate("x", s -> s + s);
        stream
            .map(s -> s.length() > 3)
            .peek(System.out::println)
            .noneMatch(tf -> tf)          // 全ての要素がfalseであるか?
        ;
    }
}

実行結果 Wandbox

false
false
true

元のコードはなにが問題か?

Predicate<? super String> p = s -> s.startsWith("g");
Stream<String> st1 = Stream.generate(() -> "orange");
Stream<String> st2 = Stream.generate(() -> "gold"));
System.out.print(st1.anyMatch(p) + " ");
System.out.println(st2.allMatch(p));

理由は、generate()メソッドはlimit()などで終了しないと無限にストリームが生成されるためとのことです。

st1

  1. よし、gで始まる文字列が一つでもあるかな?
  2. orangeはgから始まらないな。次。
  3. orangeはgから始まらないな。次。
  4. orangeはgから始まらないな。次。
  5. orangeはgから始まらないな。次。
  6. 以下、延々と続きます。

st2

  1. よし、gで始まらない文字列は一つでもあるかな?
  2. goldはgから始まるな。次。
  3. goldはgから始まるな。次。
  4. goldはgから始まるな。次。
  5. goldはgから始まるな。次。
  6. 以下、延々と続きます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

実際にそのコードを実行させてみるとわかることだと思われます。
で、それでどうなったんでしょうか

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/28 23:32

    早速回答いただきありがとうございます。
    実際コードを実行してみると、問題集の回答どおりとなり、2つ目のコードはハングしませんでした。

    ただ、なぜハングしないかはわかりません。

    キャンセル

  • 2019/09/28 23:33

    ならその回答が正解だということですね

    キャンセル

  • 2019/09/28 23:49

    回答ありがとうございます。
    ハングについても実行時エラーであると勘違いしておりました。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る