StreamEx分组到列表返回不正确的记录数
以下代码将对象流拆分为1000块,在实例化过程中处理它们,并返回最后的对象总数。StreamEx分组到列表返回不正确的记录数
在号码返回的所有情况下是正确的,除非该流的大小恰好是1.在流大小为1的情况下,返回的数是0。
任何帮助,将不胜感激。在流中没有记录为0的情况下,我也必须破解返回调用。我想解决这个问题。
AtomicInteger recordCounter = new AtomicInteger(0);
try (StreamEx<MyObject> stream = StreamEx.of(myObjects)) {
stream.groupRuns((prev, next) -> recordCounter.incrementAndGet() % 1000 != 0)
.forEach((chunk) ->
{
//... process each chunk
}
);
} catch(Exception e) {
throw new MyRuntimeException("Failure streaming...", e);
} finally {
myObjects.close();
}
return recordCounter.get() == 0 ? 0 : recordCounter.incrementAndGet();
在我与番石榴的Iterators.partition()跑到我的对象的流分割成块的结尾:
MutableInt recordCounter = new MutableInt();
try {
Iterators.partition(myObjects.iterator(), 1000)
.forEachRemaining((chunk) -> {
//process each chunk
...
recordCounter.add(chunk.size());
});
} catch (Exception e) {
throw new MyRuntimeException("Failure streaming...", e);
} finally {
myObjects.close();
}
return recordCounter.getValue();
Originally计数器来知道什么时候拆块,这是不可靠的计算对象的总数。当流的大小为0或1时groupRuns
函数未执行。
所以你需要另一种方法来计算对象。相反,在forEach
只是消费项目,你可以返回对象的数量到底
AtomicInteger counter = new AtomicInteger(0);
try (StreamEx<MyObject> stream = StreamEx.of(myObjects)) {
return stream
.groupRuns((prev, next) -> counter.incrementAndGet() % 1000 != 0)
.mapToLong((chunk) -> {
//... process each chunk
return chunk.size();
})
.sum();
} catch(Exception e) {
throw new MyRuntimeException("Failure streaming...", e);
} finally {
myObjects.close();
}
好的,继续下去 - 您在上面提到的更改为原始方法增加了100%的执行时间。它解决了这个问题,但方式太长了! –
@Nazarii Bardiuk解释,为什么它不工作处理chunk.size()
和sum
他们。我遇到了类似的要求来拆分流。所以我分叉它并做了一些更改:StreamEx-0.8.7。下面是一个简单的例子:
int count = IntStreamEx.range(0, 10).boxed().splitToList(3).mapToInt(chunk -> {
System.out.println(chunk);
return chunk.size();
}).sum();
System.out.println(count);
如果你在开始你的项目,你可以试一试,代码将是:
try (StreamEx<MyObject> stream = StreamEx.of(myObjects).onClose(() -> myObjects.close())) {
return stream.splitToList(1000)
.mapToInt((chunk) -> {
//... process each chunk
return chunk.size();
}).sum();
}
由于JavaDoc说:
sameGroup - 适用于相邻元素对的非干扰,无状态谓词,对于属于同一组的元素返回true。
谓词必须是无状态的,这不是你的情况。你滥用这个方法,这就是为什么你不能得到预期的结果。它靠近你想要的纯粹偶然的工作,你不能依赖这种行为,它在未来的StreamEx版本中可能会改变。
我们正在使用番石榴 –
你为什么要返回'计数器+ 1'而不是'counter'? – wargre
因为否则它总是返回1比它应该少。 –