Java 8 - 一旦 Stream 被消耗和操作给出错误,但在另一种情况下它不是

我是 Java 8 的新手,希望了解这两种情况之间的区别。我知道一旦一个流被操作和消耗,那么流就不能再次被重用,它会给出一个错误。


场景 1:


List<String> title = Arrays.asList("Java8", "In", "Action");

        Stream<String> s = title.stream();

        s.forEach(System.out::println);

        s.forEach(System.out::println); // THIS WILL GIVE ERROR - streams has been already operated and closed.

当我运行这个时,我得到以下错误......这是公平的。


Java8

In

Action

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed

    at java.util.stream.AbstractPipeline.sourceStageSpliterator(Unknown Source)

    at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)

    at com.test.Java8InAction.CH4.TraversableOnlyOnce.main(TraversableOnlyOnce.java:12)

场景 2:


// Filtering unique elements

List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);

numbers.stream().forEach(System.out::println);

numbers.stream().filter(n -> n % 2 == 0).distinct().forEach(System.out::println);

numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);

这里我也操作了stream,关闭了终端操作,那为什么没有报错呢?


喵喔喔
浏览 307回答 3
3回答

胡子哥哥

s.forEach使用相同流的两次调用因此出现第一个示例中的异常,而对stream()方法的调用-->numbers.stream()&nbsp;每次都生成(产生)一个新流,因此不会抛出“java.lang.IllegalStateException: stream has already been operating on”或关闭”。

炎炎设计

.stream()Stream尽管在同一个集合上调用了 a 的新实例,但它创建了一个新实例

慕哥6287543

因为一个流只能被消费一次。如果您想多次使用供应商,请为此使用供应商。Supplier<Stream<String>>&nbsp;streamSupplier&nbsp;=&nbsp;()->&nbsp;Stream.of("Java8",&nbsp;"In",&nbsp;"Action");然后用于get创建新流。streamSupplier.get().forEach(System.out::println);但在第二种情况下,您每次都会创建一个新流。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java