0

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

这是代码的第一个版本:

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

问题是一旦条件为真,流就被消耗掉了,我不能重用它。所以我尝试使用供应商从供应商返回一个 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

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

谢谢你的帮助。

4

3 回答 3

3

一旦条件为真,流就被消耗掉了,我不能重用它

中间操作(例如map)返回一个新流,因此您需要在中间操作(map)之后重新分配流。

IE

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

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

另请注意,如果您希望链接( ) 调用,还有一个中间版本的foreachcalled 。peekforeachpeek

于 2019-08-01T22:47:17.330 回答
2

Streams在 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 ->
    ...
);
于 2019-08-01T21:06:10.143 回答
1

如果保留流而不收集它对您很重要,您可以使用 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(...);
于 2019-08-01T21:37:34.073 回答