【发布时间】:2015-11-16 23:10:41
【问题描述】:
我想知道是否可以根据流外部设置的某种条件向流中添加操作。例如,如果我的limit 变量不等于-1,我想在流中添加限制操作。
我的代码目前看起来像这样,但我还没有看到其他以这种方式使用流的示例,其中将 Stream 对象重新分配给对其自身应用的中间操作的结果:
// Do some stream stuff
stream = stream.filter(e -> e.getTimestamp() < max);
// Limit the stream
if (limit != -1) {
stream = stream.limit(limit);
}
// Collect stream to list
stream.collect(Collectors.toList());
正如stackoverflow post 中所述,在调用终端操作之前不会实际应用过滤器。由于我在调用终端操作之前重新分配了流的值,所以上面的代码仍然是使用 Java 8 流的正确方法吗?
【问题讨论】:
-
您似乎没有捕获
stream.filter()的输出。 -
如果你想写成一行,你可以写
.limit(limit != -1 ? limit : Long.MAX_VALUE),但我不会。 -
@whaleberg、@WillShackleford、@Peter:我的错误,我忘记在我的原始示例代码中将过滤流的值分配给
stream。我想我对流的理解不正确。我读到所有流必须跟随终端操作才能执行,所以我认为将结果流存储在同一个stream变量中是不正确的。我会更新我原来的问题。 -
请注意,OpenJDK 中有一个有趣的功能proposed:添加
chain()方法。有了它,您的问题将在stream.filter(...).chain(s -> limit == -1 ? s : s.limit(limit)).collect(toList())这样的单个表达式中得到解决。目前此功能的状态尚不清楚:它甚至没有标记为要添加到 JDK-9 中。
标签: java java-8 limit java-stream