java解決if-else多分支技巧
阿新 • • 發佈:2022-04-13
1、分支邏輯提前return
if (CollectionUtils.isEmpty(newDataList)) {
// 提前判斷,返回業務邏輯
return;
}
TestCodeData newData = newDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).findFirst().orElse(null);
2、switch case
OuterPlatformCodeEnum codeEnum = OuterPlatformCodeEnum.getByCode(req.getExtChannelCode()); switch (codeEnum) { case ZKL: return zklPushAuditResultService.afterSaleAudit(req); case REDBOOK: return @@@; case TIKTOK: return @@@; case KWAI: return @@@; default: log.error("afterSaleAudit當前渠道還未對接{}", JSON.toJSONString(req)); return Response.ok(); }
3、列舉
public enum TimeEnum { AM("am", "上午") { @Override public void setCity(TestCodeData data, List<TestCodeData> oldDataList) { TestCodeData po = oldDataList.stream().filter(p -> p.getStartTime() == 0 && (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null); if (null != po) { data.setCity(po.getCity()); } } }, PM("pm", "下午") { @Override public void setCity(TestCodeData data, List<TestCodeData> oldCollect) { TestCodeData po = oldCollect.stream().filter( p -> (p.getStartTime() == 12 || p.getStartTime() == 0) && p.getEndTime() == 24).findFirst().orElse(null); if (po != null) { data.setCity(po.getCity()); } } }, DAY("day", "全天") { @Override public void setCity(TestCodeData data, List<TestCodeData> oldCollect) { TestCodeData po = oldCollect.stream().filter( p -> p.getStartTime() == 0 && p.getEndTime() == 24).findFirst().orElse(null); if (po == null) { po = oldCollect.stream().filter( p -> p.getStartTime() == 0 && p.getEndTime() == 12).findFirst().orElse(null); } if (po == null) { po = oldCollect.stream().filter( p -> p.getStartTime() == 12 && p.getEndTime() == 24).findFirst().orElse(null); } if (po != null) { data.setCity(po.getCity()); } } }, HOUR("hour", "小時") { @Override public void setCity(TestCodeData data, List<TestCodeData> oldCollect) { TestCodeData po = oldCollect.stream().filter( e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null); if (po != null) { data.setCity(po.getCity()); } } }; public TimeEnum valueOf(String code) { TimeEnum [] values = values(); for (TimeEnum value : values) { if (code.equals(value.getCode())) { return value.getName(); } } } public abstract void setCity(TestCodeData data, List<TestCodeData> oldCollect); private String code; private String desc; TimeEnum(String code, String desc) { this.code = code; this.desc = desc; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } for (TestCodeData data : newCollect) { String code = "am"; // 這裡假設 code 變數是從 data 中獲取的 TimeEnum.valueOf(code).setCity(data, oldCollect); }
4、函式式介面
@Service
public class KwaiAfterSaleAuditService {
private static final Logger logger = LoggerFactory.getLogger(KwaiAfterSaleAuditService.class);
private Map<Integer, BiFunction<KwaiExtchCfg, AfterSaleAuditReq, Response<Boolean>>> sourceMap = new HashMap<>();
@Resource
private KwaiApiService kwaiApiService;
@PostConstruct
private void dispatcher() {
sourceMap.put(10, this::approve);
sourceMap.put(-10, this::reject);
}
public Response<Boolean> auditDeal(KwaiExtchCfg kwaiExtchCfg, AfterSaleAuditReq req) {
BiFunction<KwaiExtchCfg, AfterSaleAuditReq, Response<Boolean>> source = sourceMap.get(req.getAuditResult());
return source.apply(kwaiExtchCfg, req);
}
private Response<Boolean> approve(KwaiExtchCfg kwaiExtchCfg, AfterSaleAuditReq req) {
OpenSellerOrderRefundReturngoodsApproveResponse response = kwaiApiService.returnGoodsApprove(kwaiExtchCfg, req, 788L);
logger.info("{}, OpenSellerOrderRefundReturngoodsApproveResponse:{}", req.getReturnsId(), JSON.toJSONString(response));
if (null != response && response.getResult() == 1) {
return Response.ok(true);
} else {
return Response.fail(response != null ? response.getErrorMsg() : "退貨稽核結果推送失敗,返回null");
}
}
private Response<Boolean> reject(KwaiExtchCfg kwaiExtchCfg, AfterSaleAuditReq req) {
OpenRefundRejectReasonResponse reasonResponse = kwaiApiService.rejectReason(kwaiExtchCfg, Long.parseLong(req.getReturnsId()));
logger.info("reasonResponse:{}", JSON.toJSONString(reasonResponse));
OpenRefundRejectResponse response = kwaiApiService.refundReject(kwaiExtchCfg, Long.parseLong(req.getReturnsId()), 12, 788L);
logger.info("{}, OpenRefundRejectResponse:{}", req.getReturnsId(), JSON.toJSONString(response));
if (null != response && response.getResult() == 1) {
return Response.ok();
} else {
return Response.fail(response != null ? response.getErrorMsg() : "退貨稽核結果推送失敗,返回null");
}
}
}
5、設計模式
工廠模式
自定義註解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExtchSynData {
String[] value();
}
工廠類
@Component
public class McoServiceFactory {
private static final Logger logger = LoggerFactory.getLogger(McoServiceFactory.class);
/**
* 資料日誌及備份 service登錄檔
*/
private Map<String, ExtchDataSaveService> extchDataSaveServiceMap = Maps.newConcurrentMap();
@PostConstruct
private void init() {
initExtchDataSaveService();
}
/**
* 初始化資料日誌及備份 service登錄檔
*/
private void initExtchDataSaveService() {
Map<String, ExtchDataSaveService> result = SpringBeanUtil.getApplicationContext().getBeansOfType(ExtchDataSaveService.class);
if (CollectionUtils.isEmpty(result)) {
logger.warn("初始化獲取失敗,沒有發現策略實現 bean。");
throw new RuntimeException("初始化資料日誌及備份");
}
for (Map.Entry<String, ExtchDataSaveService> entry : result.entrySet()) {
String beanName = entry.getKey();
ExtchDataSaveService value = entry.getValue();
ExtchSynData dataAnnotation = value.getClass().getAnnotation(ExtchSynData.class);
if (null != dataAnnotation) {
for (String string : dataAnnotation.value()) {
extchDataSaveServiceMap.put(string, value);
}
} else {
logger.info("初始化,operateType is null, bean:{}", beanName);
}
}
}
public ExtchDataSaveService getExtchDataSaveService(String operateType) {
if (operateType == null) {
logger.error("[McoServiceFactory.getExtchDataSaveService] the input param is null, return [null].");
return null;
}
return extchDataSaveServiceMap.get(operateType);
}
}
// 方法呼叫
ExtchDataSaveService extchDataSaveService = mcoServiceFactory.getExtchDataSaveService(methodName);
Response<Boolean> response = extchDataSaveService.beforeDataHandler(className, methodName, joinPoint.getArgs());
模板模式:
抽象模板類
@Service
public abstract class BaseMessageService {
private static final Logger logger = LoggerFactory.getLogger(BaseMessageService.class);
/**
* Description: 資料處理
* Date: 2021/9/15 11:17
* @Param: [parentMessage] 訊息體
* @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
*/
protected abstract Response<Boolean> dataHandle(KwaiParentMessage parentMessage);
/**
* Description: 任務執行 先處理資料再進行業務處理
* Date: 2021/9/15 11:13
* @Param: [parentMessage]
* @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
*/
public Response<Boolean> execute(KwaiParentMessage parentMessage) {
Response<Boolean> kwaiParentMessageResponse = dataHandle(parentMessage);
if (!kwaiParentMessageResponse.isOk()) {
logger.error(kwaiParentMessageResponse.getMsg());
return Response.fail("引數解析失敗");
}
return bussiness(parentMessage);
}
/**
* Description: 業務處理
* Date: 2021/9/15 11:17
* @Param: [parentMessage]
* @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
*/
protected abstract Response<Boolean> bussiness(KwaiParentMessage parentMessage);
}
// 分支業務類
@KwaiEvent({"kwaishop_order_statusChange"})
@Service
public class KwaiOrderMessageService extends BaseMessageService {
private static final Logger logger = LoggerFactory.getLogger(KwaiOrderMessageService.class);
@Resource
private KwaiApiService kwaiApiService;
@Resource
private KwaiExtchCfgService kwaiExtchCfgService;
@Resource
private KwaiMcoOrderService kwaiMcoOrderService;
@Override
protected Response<Boolean> dataHandle(KwaiParentMessage parentMessage) {
try {
if (StringUtils.isEmpty(parentMessage.getInfo())) {
logger.error("缺少訊息詳細資訊:{}", JSON.toJSONString(parentMessage));
return Response.fail("缺少訊息體");
}
KwaiMessageOrder kwaiMessageOrder = JSON.parseObject(parentMessage.getInfo(), KwaiMessageOrder.class);
parentMessage.setKwaiMessage(kwaiMessageOrder);
} catch (Exception e) {
logger.error("引數解析失敗message:{}", JSON.toJSONString(parentMessage), e);
return Response.fail("引數解析失敗");
}
return Response.ok();
}
@Override
protected Response<Boolean> bussiness(KwaiParentMessage parentMessage) {
KwaiExtchCfg kwaiExtchCfg = kwaiExtchCfgService.obtainCacheExtchCfg(String.valueOf(parentMessage.getUserId()));
KwaiMessageOrder kwaiMessageOrder = (KwaiMessageOrder) parentMessage.getKwaiMessage();
logger.info("訊息單個訂單獲取 oid:{}", kwaiMessageOrder.getOid());
if (!(Constants.PULL_ORDER_STATUS_30 == kwaiMessageOrder.getStatus()
|| Constants.PULL_ORDER_STATUS_40 == kwaiMessageOrder.getStatus()
|| Constants.PULL_ORDER_STATUS_50 == kwaiMessageOrder.getStatus()
|| Constants.PULL_ORDER_STATUS_70 == kwaiMessageOrder.getStatus())) {
return Response.ok();
}
OpenOrderCursorListResponse response = kwaiApiService.obtainOrderDetail(kwaiMessageOrder.getOid(), kwaiExtchCfg);
logger.info("訊息單個訂單獲取返回 oid:{} response:{}", kwaiMessageOrder.getOid(), JSON.toJSONString(response));
if (response.isSuccess() && null != response.getData() && null != response.getData().getOrderList() && response.getData().getOrderList().length > 0) {
OrderList orderList = response.getData().getOrderList()[0];
Response<Boolean> singleResponse = kwaiMcoOrderService.singleOrderByOrderList(orderList, kwaiExtchCfg, null);
logger.info("訊息單個訂單處理結果oid:{}, res:{}", kwaiMessageOrder.getOid(), JSON.toJSONString(singleResponse));
}
return Response.ok();
}
}
// 快取服務類工廠
@Component
public class KwaiAcceptServiceFactory {
private static final Logger logger = LoggerFactory.getLogger(KwaiAcceptServiceFactory.class);
/**
* 訊息service登錄檔
*/
private Map<String, BaseMessageService> messageServiceMap;
@PostConstruct
private void init() {
messageServiceMap = new HashMap<>(8);
initMessageService();
}
/**
* 初始化service登錄檔
*/
private void initMessageService() {
Map<String, BaseMessageService> result = SpringBeanUtil.getApplicationContext().getBeansOfType(BaseMessageService.class);
if (CollectionUtils.isEmpty(result)) {
logger.warn("初始化獲取失敗,沒有發現策略實現 bean。");
throw new RuntimeException("初始化訊息處理類失敗");
}
for (Map.Entry<String, BaseMessageService> entry : result.entrySet()) {
String beanName = entry.getKey();
BaseMessageService value = entry.getValue();
KwaiEvent dataAnnotation = value.getClass().getAnnotation(KwaiEvent.class);
if (null != dataAnnotation) {
for (String string : dataAnnotation.value()) {
messageServiceMap.put(string, value);
}
} else {
logger.info("初始化,operateType is null, bean:{}", beanName);
}
}
}
/**
* Description: 獲取訊息處理類
* Date: 2021/9/14 19:21
*
* @Param: [operateType]
* @Return: cn.com.gome.scot.alamein.mco.kwai.job.business.domain.message.BaseMessageService
*/
public BaseMessageService obtainMessageService(String operateType) {
if (operateType == null) {
logger.error("[McoServiceFactory.getExtchDataSaveService] the input param is null, return [null].");
return null;
}
return messageServiceMap.get(operateType);
}
}