我正在使用Java流,我需要一种方法来计算流中的所有元素,同时使用skip()和limit()对它们的子集执行操作。 我的目标是在不使用任何辅助结构来减少堆空间使用的情况下做到这一点,因为输入的数据可能非常大。
我也更愿意避开 peek() 方法,因为它在特定场景中存在潜在的副作用,如本文章
中所述public static <T> long extractAndProcess(Stream<T> streamData, int pageIndex, int itemsPerPage, Consumer<T> itemHandler) {
long startPosition = (long) pageIndex * itemsPerPage;
AtomicLong totalCount = new AtomicLong();
streamData.peek(item -> totalCount.incrementAndGet())
.skip(startPosition)
.limit(itemsPerPage)
.forEachOrdered(itemHandler);
return totalCount.get();
}
我尝试在这里使用 peek() ,但与 .limit() 结合使用,它在特定情况下无法像我假设的那样工作。
处理您所描述的情况的唯一可行的解决方案看起来像
streamData.forEachOrdered(elem -> {
int i = totalCount.getAndIncrement();
if (i >= startPosition && i < startPosition + itemsPerPage) {
itemHandler.accept(i);
}
})
我不相信存在更好的解决方案;流实际上并不是为了做你想要用它们做的事情而设计的。