当前位置: 首页 > 知识库问答 >
问题:

在Java8中重用流[duplicate]

雍俊远
2023-03-14
Collection<MyClass> collection = /* form the collection */;
Stream<MyClass> myStream = collection.stream().filter(/* some filter */);
MyClass first = myStream.findFirst().get();
myStream.forEach(/* do stuff */);
java.lang.IllegalStateException: stream has already been operated upon or closed
    null

所以我想我有几个问题是基于我的发现。

  1. 如果不能重用流,那么何时返回流的实例以供以后使用?
  2. 是否可以克隆流,以便重用它们而不会导致IllegalStateException

共有1个答案

赖绪
2023-03-14

如果您不能重用流,那么何时返回流的实例以供以后使用才有用呢?

如果您有一个返回流的方法,并且需要该流执行两项任务,只需调用该方法两次并获得两个不同的流。

是否可以克隆流,以便在不导致IllegalStateException的情况下重用它们?

Supplier<Stream<MyClass>> sup = () -> collection.stream().....;  /

first = sup.get().findFirst().get(); // do one thing
sup.get().forEach(...);  // do another thing
 类似资料:
  • 我正在尝试根据买入或卖出方向对股票订单列表进行排序。 我试过这样的方法: 我看到下面的错误消息,我不清楚。 不兼容的类型。必需的int,但已将“comparing”推断给Comparator:不存在类型变量T,U的实例,因此Comparator符合Integer。

  • 我的想法是: 是最好的办法吗?

  • 此问题是之前问题的后续:使用Streams添加BigDecimals 这个问题与使用Java8和Lambda表达式添加有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,方法都会抛出一个。 考虑下面的代码: 香草Java代码对空集合没有问题,但是新的Java8代码有问题。 在这里避免NSEE最优雅的方式是什么?当然,我们可以做到: 但是有没有一种Java的方法来处理空集合?

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这

  • 我有一个HashMap,我需要使用一些函数对其进行筛选: 上述代码中的错误是变量的声明类型。应该是而不是。 所以现在的功能代码是:

  • 我试图列出整数列表中的重复元素,例如, 使用jdk 8的流。有人试过吗?要删除重复项,我们可以使用distinct() api。但是如何找到重复的元素呢?有人能帮我吗?