Java8流减少了具有流畅API的对象列表

时间:2016-05-24 12:37:28

标签: java java-stream reduce

是否可以通过流畅的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重写此内容?

1 个答案:

答案 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);