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

线程“main”java.lang.IllegalStateException中的异常:

线程“main”java.lang.IllegalStateException中的异常:

慕仙森 2022-07-14 17:11:51
我有这个片段:    final Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));    stream.filter(a->true);//LINE PROBLEM I JUST THOUGHT THAT THIS WOULD  JUST IGNORE    System.out.println(stream.count());但是抛出:Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed我知道流只能使用一次,但这条线有什么问题?它正在消耗流?stream.filter(a->true);//NOT A TERMINAL OPERATION A INTERMEDIATE OPERATION如果我撕掉它,只需像这样使用我的代码System.out.println(stream.filter(a->true).count());不抛出异常。如果我使用此代码,则会抛出 NotException。    Stream<String>stream = getStream().filter(a->StringUtils.contains(a,"http"));    stream = stream.filter(a->true);    System.out.println(stream.count());但是为什么过滤器抛出异常而不是终端操作?我只使用最简单的代码来理解这个想法。我正在使用带有 Java 8 更新 122 的 Netbeans 8.2,也在 Intellij Idea 2018 Ultimate 中进行了测试。
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

根据Streamjavadoc:

一个流应该只被操作一次(调用一个中间或终端流操作)。例如,这排除了“分叉”流,其中相同的源提供两个或多个管道,或同一流的多次遍历。如果流实现检测到流正在被重用,它可能会抛出 IllegalStateException。但是,由于某些流操作可能返回其接收者而不是新的流对象,因此可能无法在所有情况下检测重用。

为避免这种情况,您可以使用Stream.Builder

另请参阅复制流以避免“流已被操作或关闭”


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 138 浏览

添加回答

举报

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