背景:如果一个商家有A,B二个门店,想把A的属性复制给B
主要使用BiFunction的使用
实现:
public interface CopyRule {
/**
* 对in执行拷贝结果到out中.
*
* @param in
* @param out
* @return
*/
boolean copy(CopyIn in, CopyOut out);
/**
* 当此条校验不通过的时候,对应的错误码是什么.
*
* @return
*/
FailReasonEnum errorCode();
}
public enum ShopCopyRule implements CopyRule {
BUSINESS_MODE((i, o) -> {
o.getShopOrderRequest().setBussinessMode(i.getSource().getOrderInfo().getBussinessMode());
return true;
}, COPY_ORDER_FIELD_FAILED),
NUMBER_LIMIT((i, o) -> {
o.getShopOrderRequest().setNumberLimited(i.getSource().getOrderInfo().getNumberLimited());
return true;
}, COPY_ORDER_FIELD_FAILED);
/**
* 业务规则
*/
private final BiFunction<CopyIn, CopyOut, Boolean> function;
/**
* 校验失败时对应的错误码.
*/
private final FailReasonEnum errorCode;
ShopCopyRule(BiFunction<CopyIn, CopyOut, Boolean> function, FailReasonEnum errorCode) {
this.function = function;
this.errorCode = errorCode;
}
@Override
public boolean copy(CopyIn in, CopyOut out) {
return function.apply(in, out);
}
@Override
public FailReasonEnum errorCode() {
return errorCode;
}
//统一调用这个方法
public List<ErrorContext> copyRule(CopyItem copyItem, CopyIn in,
CopyOut out) {
List<ErrorContext> errors = Lists.newArrayList();
for (ShopCopyRule rule : ShopCopyRule.values()) {
if (-1 == 开关.indexOf(rule.name())) {
continue;
}
if (!rule.copy(in, out)) {
LoggerUtil.warn(LOGGER, "执行规则:{0}时失败", rule.name());
errors.add(new ErrorContext(rule.errorCode().getId()));
}
}
LoggerUtil.info(LOGGER, "完成执行:{0}规则", copyItem);
return errors;
}