回答編集履歴
2
update
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
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
|
|