是否可以通过流畅的API方法减少对象列表?例如,我有一个List
com.mysema.query.types.expr.BooleanExpression
,应该通过com.mysema.query.types.expr.BooleanExpression#and
方法联合起来。我可以通过古老而可靠的方式来做到这一点,但是有点难看:
BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
result = result.and(predicates.get(i));
}
是否有机会通过Java 8流API重写此内容?
答案 0 :(得分:5)
是的,您可以使用reduce
操作:
BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);
此代码将通过and
每个中间结果减少所有谓词。
如果列表为空,则返回Optional<BooleanExpression>
。由于您当前的代码假设至少有一个元素(通过直接调用.get(0);
),因此上面的代码段会抛出AssertionError
。你当然可以使用自己的例外。
如果你可以拥有一个身份,BooleanExpression
总是在这里返回true
,你也可以使用
BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);