Java Stream has already been operated upon or closed

摘要: In Java 8, Stream cannot be reused, once it is consumed or used, the stream will be closed.

In Java 8, Stream cannot be reused, once it is consumed or used, the stream will be closed.

1. Example – Stream is closed!

Review the following example, it will throw an IllegalStateException, saying “stream is closed”.

TestJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.stream.Stream;
public class TestJava8 {
    public static void main(String[] args) {
        String[] array = {"a", "b", "c", "d", "e"};
        Stream<String> stream = Arrays.stream(array);
        // loop a stream
        stream.forEach(x -> System.out.println(x));
        // reuse it to filter again! throws IllegalStateException
        long count = stream.filter(x -> "b".equals(x)).count();
        System.out.println(count);

Output

java.lang.IllegalStateException: stream has already been operated upon or closed
	at java.util.stream.AbstractPipeline.(AbstractPipeline.java:203)
	at java.util.stream.ReferencePipeline.(ReferencePipeline.java:94)
	at java.util.stream.ReferencePipeline$StatelessOp.(ReferencePipeline.java:618)
	at java.util.stream.ReferencePipeline$2.(ReferencePipeline.java:163)
	at java.util.stream.ReferencePipeline.filter(ReferencePipeline.java:162)
	at com.hostingcompass.whois.range.run.TestJava8.main(TestJava8.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

2. Example – Reuse a stream

For whatever reason, you really want to reuse a Stream, try the following Supplier solution :

TestJava8.java
package com.mkyong.java8;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class TestJava8 {
    public static void main(String[] args) {
        String[] array = {"a", "b", "c", "d", "e"};
        Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
        //get new stream
        streamSupplier.get().forEach(x -> System.out.println(x));
        //get another new stream
        long count = streamSupplier.get().filter(x -> "b".equals(x)).count();
        System.out.println(count);

Output


Each get() will return a new stream.

Why?
May I know why you need to reuse a stream, for testing?

References

  1. Supplier JavaDoc
  2. Stream summary JavaDoc

上一篇: Java How to convert Array to Stream
下一篇: Windows 10 Can not create new folder
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章来源于互联网, 若有侵权, 联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布文章.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号