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

igo*_*024 4 java reduce java-stream

是否可以通过流畅的API方法减少对象列表?举例来说,我有一个Listcom.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重写这个?

Tun*_*aki 5

是的,你可以使用这个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)