igo*_*024 4 java reduce java-stream
是否可以通过流畅的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));
}
Run Code Online (Sandbox Code Playgroud)
有没有机会通过Java 8流API重写这个?
是的,你可以使用这个reduce操作:
BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);
Run Code Online (Sandbox Code Playgroud)
此代码将通过and每个中间结果减少所有谓词.
Optional<BooleanExpression>如果列表为空,则返回.由于您当前的代码假设至少有一个元素(通过.get(0);直接调用),因此上面的代码段会抛出一个元素AssertionError.你当然可以使用自己的例外.
在那里你可以有一个身份,这将是一个的情况下BooleanExpression始终返回true这里,你也可以使用
BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);
Run Code Online (Sandbox Code Playgroud)