Java8 流畅地减少对象列表 API
Java8 stream reducing list of objects with fluent API
是否可以通过流畅的API方法减少对象列表?例如,我有一个 List
的 com.mysema.query.types.expr.BooleanExpression
应该通过 com.mysema.query.types.expr.BooleanExpression#and
方法合并。我可以像这样通过旧的和可靠的 for-each 来做到这一点,但有点难看:
BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
result = result.and(predicates.get(i));
}
是否有机会通过 Java 8 流 API 重写此内容?
可以,可以使用reduce
操作:
BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);
此代码将通过 and
-ing 每个中间结果来减少所有谓词。
这 return 是一个 Optional<BooleanExpression>
以防列表为空。由于您当前的代码假定至少有一个元素(通过直接调用 .get(0);
),因此上面的代码片段在这种情况下会抛出一个 AssertionError
。您当然可以使用自己的例外。
在你可以有一个身份的情况下,在这里总是 BooleanExpression
return true
,你也可以使用
BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);
是否可以通过流畅的API方法减少对象列表?例如,我有一个 List
的 com.mysema.query.types.expr.BooleanExpression
应该通过 com.mysema.query.types.expr.BooleanExpression#and
方法合并。我可以像这样通过旧的和可靠的 for-each 来做到这一点,但有点难看:
BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
result = result.and(predicates.get(i));
}
是否有机会通过 Java 8 流 API 重写此内容?
可以,可以使用reduce
操作:
BooleanExpression result = predicates.stream().reduce(BooleanExpression::and).orElseThrow(AssertionError::new);
此代码将通过 and
-ing 每个中间结果来减少所有谓词。
这 return 是一个 Optional<BooleanExpression>
以防列表为空。由于您当前的代码假定至少有一个元素(通过直接调用 .get(0);
),因此上面的代码片段在这种情况下会抛出一个 AssertionError
。您当然可以使用自己的例外。
在你可以有一个身份的情况下,在这里总是 BooleanExpression
return true
,你也可以使用
BooleanExpression result = predicates.stream().reduce(identity, BooleanExpression::and);