Java8 流畅地减少对象列表 API

Java8 stream reducing list of objects with fluent API

是否可以通过流畅的API方法减少对象列表?例如,我有一个 Listcom.mysema.query.types.expr.BooleanExpression 应该通过 com.mysema.query.types.expr.BooleanExpression#and 方法合并。我可以像这样通过旧的和可靠的 for-each 来做到这一点,但有点难看:

BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
   result = result.and(predicates.get(i));
}

是否有机会通过 Java 8 流 API 重写此内容?

可以,可以使用reduce操作:

BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);

此代码将通过 and-ing 每个中间结果来减少所有谓词。

这 return 是一个 Optional<BooleanExpression> 以防列表为空。由于您当前的代码假定至少有一个元素(通过直接调用 .get(0);),因此上面的代码片段在这种情况下会抛出一个 AssertionError。您当然可以使用自己的例外。

在你可以有一个身份的情况下,在这里总是 BooleanExpression return true,你也可以使用

BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);