【发布时间】:2018-02-14 20:12:05
【问题描述】:
我有 n 个条目的有限流。它的计数提前未知。数据大小大约为 10Gb,而且对于 RAM 来说太大了,所以我无法将其作为一个整体来阅读。 在每 100000 个条目之后分块处理该流的方法是什么?
Stream<?> blocks
所以我无法使用 subList 等方法。
我可以在代码中想象它是这样的:
IntStream
.range(0, Integer.MAX_VALUE)
.filter(s -> s % 100000 == 0)
.mapToObj(s -> blocks
.skip(s)
.collect(Collectors.toList())
.forEach(MyClass::doSomething)
);
但是我得到了错误,因为 limit 是终端操作符并且它关闭了流。有什么解决方法吗?
【问题讨论】:
-
我明白我为什么会收到这个错误,但这并不能帮助我想出解决方法。
-
“因为限制是终端操作员”
limit不是终端操作,你的代码中根本没有limit操作。 -
另外,
MyClass::doSomething是什么?在.collect(Collectors.toList())之后链接.forEach(MyClass::doSomething)表明无论如何都会为单个元素调用此方法,那么这里哪里需要额外的批处理呢?blocks.forEach(MyClass::doSomething)足以一次处理一个元素,而无需一次将所有内容加载到内存中。
标签: java-stream