1. 程式人生 > 其它 >java解決if-else多分支技巧

java解決if-else多分支技巧

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);
    }
}