teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

update

2017/03/10 08:02

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -14,4 +14,6 @@
14
14
  ---
15
15
  > Streamが空であるかどうかの判定
16
16
 
17
- いずれも正しい実装です。要素数が多いときは、短絡評価(short-circuit)を行う後者`isEmpty2()`メソッドの方が効率が良いと思います。
17
+ いずれも正しい実装です。要素数が多いときは、短絡評価(short-circuit)を行う後者`isEmpty2()`メソッドの方が効率が良いと思います。
18
+
19
+ 追記:対象ストリームが無限ストリーム(例:[`java.util.Random#ints()`](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html#ints--))の場合、前者`isEmpty()`メソッドは正常に機能しなくなります。安全性と効率の両面から後者実装の方が好ましいと思いました。

1

update

2017/03/10 08:01

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -7,6 +7,10 @@
7
7
 
8
8
  Streamオブジェクトをクラスフィールドとして持つのは不適切です。Streamオブジェクトは「使い切り」、つまり利用のたびに`stream()`メソッドにて生成する必要があります。
9
9
 
10
+ Java 8 [インタフェースStream<T>](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html)より引用:
11
+
12
+ > (中間または終端ストリーム操作を呼び出して)ストリームを操作するのは、一度だけにすべきです。このため、たとえば同じソースが2つ以上のパイプラインに対してデータを供給する「フォークされた」ストリームや、同じストリームを複数回トラバースすることなどは、禁止されます。ストリーム実装は、ストリームが再利用されているのを検出すると、IllegalStateExceptionをスローします。ただし、一部のストリーム操作からは新しいストリーム・オブジェクトではなくレシーバが返されることがあるため、場合によっては再利用を検出できない可能性があります。
13
+
10
14
  ---
11
15
  > Streamが空であるかどうかの判定
12
16