有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java8一旦流被使用和操作,就会给出错误,但在另一种情况下,它不是

我是Java8新手,希望了解这两种场景之间的区别。我知道,一旦一个流被操作和使用,那么流就不能再被重用,它将给出一个错误

场景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并关闭了终端操作,那么为什么我没有得到任何错误呢


共 (4) 个答案

  1. # 2 楼答案

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

  2. # 3 楼答案

    因为一个流只能被消耗一次。如果要使用多次,请为此使用Supplier

    Supplier<Stream<String>> streamSupplier = ()-> Stream.of("Java8", "In", "Action");
    

    然后使用get创建一个新流

    streamSupplier.get().forEach(System.out::println);
    

    但在第二个场景中,每次都创建一个新流

  3. # 4 楼答案

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