Java8使用fluent API减少对象流列表
是否可以通过fluent API方法减少对象列表?例如,我有一个Java8使用fluent API减少对象流列表,java,java-stream,reduce,Java,Java Stream,Reduce,是否可以通过fluent API方法减少对象列表?例如,我有一个com.mysema.query.types.expr.booleanpression的List,它应该通过com.mysema.query.types.expr.booleanpression#和方法统一起来。我可以通过旧的和可靠的方法来实现,但有点难看: BooleanExpression result = predicates.get(0); for (int i = 1; i < predicates.size();
com.mysema.query.types.expr.booleanpression
的List
,它应该通过com.mysema.query.types.expr.booleanpression#和方法统一起来。我可以通过旧的和可靠的方法来实现,但有点难看:
BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
result = result.and(predicates.get(i));
}
BooleanExpression结果=谓词.get(0);
for(inti=1;i
是否有机会通过Java 8流API重写此操作?是的,您可以使用以下操作:
BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);
此代码将通过和-ing每个中间结果来减少所有谓词
如果列表为空,则返回一个值。由于当前代码假定至少有一个元素(通过直接调用.get(0);
),因此在这种情况下,上面的代码段会抛出一个AssertionError
。当然,您可以使用自己的异常
如果您可以拥有一个标识,即布尔表达式
始终返回true
,那么您也可以使用
BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);
即使您有一个标识表达式,也可以使用.reduce(booleanpression::and).orElse(标识)
甚至不用麻烦将标识与另一个布尔表达式相结合。