为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喔喔 2021-11-03 15:10:34
我是 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.当我运行这个时,我得到以下错误......这是公平的。Java8InActionException 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 elementsList<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,关闭了终端操作,那为什么没有报错呢?
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-11-03
?
炎炎设计

TA贡献1808条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-11-03
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

因为一个流只能被消费一次。如果您想多次使用供应商,请为此使用供应商

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

然后用于get创建新流。

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

但在第二种情况下,您每次都会创建一个新流。


查看完整回答
反对 回复 2021-11-03
  • 3 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信