Автор оригинала: mkyong.
В Java 8/|Поток нельзя использовать повторно, как только он будет использован или использован, поток будет закрыт.
1. Пример – Поток закрыт!
Просмотрите следующий пример, он вызовет исключение IllegalStateException
со словами “поток закрыт”.
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"}; Streamstream = 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); } }
Выход
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. Пример – Повторное использование потока
По какой-либо причине вы действительно хотите повторно использовать поток, попробуйте следующее Поставщик
решение:
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> 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); } }
Выход
a b c d e 1
Каждый get()
вернет новый поток.
Рекомендации
Оригинал: “https://mkyong.com/java8/java-stream-has-already-been-operated-upon-or-closed/”