Java 8 Stream 流已被操作或关闭

来源:互联网 发布:java 日期格式化 编辑:程序博客网 时间:2024/05/22 15:21

在Java 8中,Stream不能重复使用,一旦被消耗或使用,流将被关闭,类似流水线,水龙头的水一样一去不复返

示例 - 流关闭

查看以下示例,它会抛出一个IllegalStateException,表示“流被关闭”。

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 closedat 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)

示例 - 重用流

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

每个get()都会返回一个新的流
原创粉丝点击