转载 

Java – Stream has already been operated upon or closed

分类:    240人阅读    IT小君  2018-07-01 09:41

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

a
b
c
d
e
1

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
点击广告,支持我们为你提供更好的服务

css鼠标跟随文字模糊特效

js+css3抽奖转盘旋转点餐代码

网页设计开发公司网站模板

响应式太阳能能源公司网站模板

canvas炫酷鼠标移动文字粒子特效

html5图标下拉搜索框自动匹配代码

jQuery右端悬浮带返回顶部特效

HTML5 Canvas竖直流动线条背景动画特效

HTML5数字产品服务公司网站模板

响应式咖啡饮品宣传网站模板

现代时尚家具公司网站模板

小众时尚单品在线电子商务网站模板

中小型创意设计服务公司网站模板

html5 canvas进度条圆环图表统计动画特效

css+js实现的颜色渐变数字时钟动画特效

有机水果蔬菜HTML5网站模板

html5 svg夜空中星星流星动画场景特效

响应式时尚单品在线商城网站模板

html5 canvas彩色碎片组合球形旋转动画特效

HTML5现代家居装潢公司网站模板

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务