3.5 Reducer聚合 对一个扩展点多个实现的返回结果进行聚合(合并结果) 所有的聚合类都需要实现IReducer接口,并自定义 reduce() stop() 方法实现
/** 返回第一个符合条件的,短路式中止后续扩展点执行,用于参数校验等场景 */
public static <R> SimpleReducer<R> firstOf(final Predicate<R> p) {
return new SimpleReducer<R>() {
public R reduce(List<R> list) {
R result = null;
if (list != null && list.size() > 0)
result = list.get(list.size() - 1);
return result;
}
public boolean stop(List<R> list) {
boolean result = false;
if (list != null && list.size() > 0)
result = p.test(list.get(list.size() - 1));
return result;
}
};
}
伪代码示例
List<R> resultList = new ArrayList<>();
for (ExtensionSpec task : this.taskList) {
...
result = apply(task.getExt(), preResult);
...
resultList.add(result);
if (this.reducer.stop(resultList))
break;
}
result = (R) this.reducer.reduce(resultList);