JAVA-STREAM : 重复使用double a DoubleStream

JAVA-STREAM : re-use double a DoubleStream

我需要一个技巧来解决这个问题,我正在使用 Java 1.8 我从 return 一个 DoubleStream 对象的方法中检索了一个对象。所以,问题是流被消耗后我无法重用它。

这是代码的第一个版本:

 DoubleStream stream = object.getvalueStream(a,b);
 if(condtion)
   stream.map(v -> v * 2);
 stream.forEach(value -> {
        // do something
  }

问题是,一旦条件为真,流就被消耗掉了,我不能重新使用它。所以我尝试使用供应商来 return 来自供应商的 doubleStream 并迭代公开它。

但当我尝试从已使用的流对象中恢复流时,问题仍然存在。

这是我更新的代码:

      DoubleStream stream = object.getvalueStream(a,b);
      if(condtion)
      stream.map(v -> v * 2);
      Supplier>DoubleStream> streamSupplier = () -> DoubleStream.of(stream.toArray());
      streamSupplier.get().forEach(value -> {
           //Do something

但我仍然遇到同样的问题,因为如果条件为真,我会从已经使用的流中创建我的供应商。

感谢您的帮助。

Streams in Java 不能重复使用。您应该 collect 结果并像

一样流式传输两次
List<Double> doubles = object.getvalueStream(a,b).boxed().collect(toList());

if(condition) {
    doubles = doubles.stream().map(v -> v * 2).boxed().collect(toList);
}

// and further processing here
doubles.stream().forEach(v ->
    ...
);

如果保留流而不收集流对您很重要,则可以使用 map()。这种方法唯一的缺点是每次都必须检查条件

DoubleStream stream = object.getvalueStream(a,b).map(v-> condition ? v*2 : v).forEach(...);

或者将正确的 Stream 赋值给变量

DoubleStream stream = condition ? object.getvalueStream(a,b).map(v->v*2) : object.getvalueStream(a,b).map(v->v*2).forEach(...);

once the condition is true, the stream is consumed And I can not reuse it

中间操作(例如map)return一个新的流,因此需要在中间操作后重新分配流(map).

DoubleStream stream = object.getvalueStream(a,b);
if (condition) {
    stream = stream.map(v -> v * 2);
}
stream.forEach(value -> {
    // do something
}

注意 终端 操作(例如 foreach)不 return 流。所以如果你想要很多终端操作,你应该收集流以便可以重复使用。

另请注意,如果您希望链接 foreach (peek) 调用,还有一个名为 peekforeach 中间版本。