tokuhirom's Blog

Java8 Stream API では collector とかを複数回呼ぶと実行時エラーになる

以下のようなコードは、実行時エラーになる。

Stream<String> ss = Arrays.asList("hoge", "fuga").stream();
System.out.println(ss.count());
System.out.println(ss.count());

スタックトレースは以下のようになる。

stream has already been operated upon or closed
java.lang.IllegalStateException
    at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
    at java.util.stream.LongPipeline.<init>(LongPipeline.java:91)
    at java.util.stream.LongPipeline$StatelessOp.<init>(LongPipeline.java:572)
    at java.util.stream.ReferencePipeline$5.<init>(ReferencePipeline.java:221)
    at java.util.stream.ReferencePipeline.mapToLong(ReferencePipeline.java:220)
    at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
    at StreamSampleTest.testStreamTwice(StreamSampleTest.java:21)
    ...

実行時エラーになるのはつらい。慣れてないときはこういうの書いちゃう人大そう。

というようなことがあるので、Stream に対する代入は今後、IDEが警告するようになるんじゃないか?

という話を Java についてカジュアルに語るチャンネルである #java-casual@freenode でしていたというメモ。