🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

3回答

1541閲覧

Java SE8 Streamについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2019/09/28 14:15

編集2019/09/28 14:33

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

java

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

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

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

java

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

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

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

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

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

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

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

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

swordone

2019/09/28 14:31

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

回答3

0

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

投稿2019/09/28 14:22

編集2019/09/28 14:23
y_waiwai

総合スコア88040

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

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

退会済みユーザー

退会済みユーザー

2019/09/28 14:32

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

2019/09/28 14:33

ならその回答が正解だということですね
退会済みユーザー

退会済みユーザー

2019/09/28 14:49

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

0

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

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

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

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

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

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

Java

1import java.util.stream.Stream; 2 3class Main { 4 public static void main(String[] args) { 5 Stream<String> stream = Stream.iterate("x", s -> s + s); 6 stream 7 .map(s -> s.length() > 3) 8 .peek(System.out::println) 9 .noneMatch(tf -> tf) // 全ての要素がfalseであるか? 10 ; 11 } 12}

実行結果 Wandbox

false false true

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

Java

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
0. よし、gで始まる文字列が一つでもあるかな?
0. orangeはgから始まらないな。次。
0. orangeはgから始まらないな。次。
0. orangeはgから始まらないな。次。
0. orangeはgから始まらないな。次。
0. 以下、延々と続きます。

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

投稿2019/09/28 23:41

LouiS0616

総合スコア35668

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

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

0

ベストアンサー

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

投稿2019/09/28 14:45

swordone

総合スコア20669

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

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

退会済みユーザー

退会済みユーザー

2019/09/28 14:47

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問