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

Jef*_*ook 9 java java-8 java-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.
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

情景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);
Run Code Online (Sandbox Code Playgroud)

这里我也操作流并关闭终端操作,那为什么我没有得到任何错误?

Ous*_* D. 8

两个调用s.forEach使用相同的流,因此在第一个例子中的异常,而对stream()方法的调用- > numbers.stream() 每次生成(产生)一个新的流因此不会抛出"java.lang.IllegalStateException:stream已经被操作或关闭".


sta*_*r67 5

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