Java 8:停止检查所有流元素的缩减操作
我试图了解是否有一种方法可以在不检查整个流的情况下终止约简操作,并且我无法找到方法。
用例大致如下:让有一长串需要折叠成.每个元素检查都有潜在的昂贵,因此在 中,我对传入的元素执行检查,以查看我们是否需要执行昂贵的操作 - 如果我们不需要,那么我只需返回累加器。Integer
Accumulator
Accumulator
Accumulator
对于小型列表来说,这显然是一个很好的解决方案,但是大型列表会产生不必要的流元素访问成本,我想避免。
这是一个代码草图 - 假设只有串行减少。
class Accumulator {
private final Set<A> setA = new HashSet<>;
private final Set<B> setB = new HashSet<>;
}
class ResultSupplier implements Supplier<Result> {
private final List<Integer> ids;
@Override
public Result get() {
Accumulator acc = ids.stream().reduce(new Accumulator(), f(), (x, y) -> null);
return (acc.setA.size > 1) ? Result.invalid() : Result.valid(acc.setB);
}
private static BiFunction<Accumulator, Integer, Accumulator> f() {
return (acc, element) -> {
if (acc.setA.size() <= 1) {
// perform expensive ops and accumulate results
}
return acc;
};
}
}
除了必须遍历整个,还有另一个事实我不喜欢 - 我必须检查相同的条件两次(即大小检查)。Stream
setA
我已经考虑过和操作,但它们似乎更像是一样的,并没有发现它们在实质上改变了这样一个事实,即如果不检查整个流,我就无法完成折叠操作。map()
collect()
此外,我的想法是,虚构的流API通讯员也不会给我们带来任何好处,因为终止条件取决于累加器,而不是流元素本身。takeWhile(p : (A) => boolean)
请记住,我是FP的相对新手,所以 - 有没有办法让它像我预期的那样工作?我是否不正确地设置了整个问题,或者这种限制是设计使然?