二元组优化if(大佬帮忙看看 还有没有优化的空间)

79 阅读1分钟

优化前

public class StrategyAndFactoryDemo {

    public static void main(String[] args) {
        String type = "xxx";

        if(QRCodeEnum.one.getCodeType().equalsIgnoreCase(type)){
            oneMethod(wxMessgeBean);
        }else if(QRCodeEnum.two.getCodeType().equalsIgnoreCase(type)){
            twoMethod(wxMessgeBean);
        }else if(QRCodeEnum.three.getCodeType().equalsIgnoreCase(type)){
            threeMethod(wxMessgeBean);
        // ...
        } else{
            log.error("回调:角色类型错误")
        }
    }
}

public enum QRCodeEnum {
    one("one"),
    two("two"),
    three("three")
    // ...
    ;
    
    private final String codeType;

    QRCodeEnum(String codeType) {
        this.codeType = codeType;
    }

    public String getCodeType() {
        return codeType;
    }
}

优化后(方法)

public class StrategyAndFactoryDemo {

    public static void main(String[] args) {
        // 二元组列表
        List<StrategyFactory<Consumer<WXMessgeBean>>> strategyFactoryList = new ArrayList<>();

        /*
        // 原生写法
        StrategyFactory<Consumer<WXMessgeBean>> strategyFactory = new StrategyFactory();
        strategyFactory.setCondition(QRCodeEnum.give_product.getCodeType().equalsIgnoreCase(wxQrCodeParam.getCodeType()));
        strategyFactory.setContent(
                (wmb) -> {
                    giveProductCodeType(wmb);
                }
        );
        strategyFactoryList.add(strategyFactory);


        // lambda写法
        strategyFactoryList.add(new StrategyFactory<Consumer<WXMessgeBean>>()
                .setCondition(QRCodeEnum.give_product.getCodeType().equalsIgnoreCase(wxQrCodeParam.getCodeType()))
                .setContent((wmb) -> giveProductCodeType(wmb)));
        */

        String type = "xxx";
        // 方法引用
        // 添加条件与执行方法
        strategyFactoryList.add(new StrategyFactory<Consumer<WXMessgeBean>>()
                .setCondition(QRCodeEnum.give_product.getCodeType().equalsIgnoreCase(type))
                .setContent(this::oneMethod));

        strategyFactoryList.add(new StrategyFactory<Consumer<WXMessgeBean>>()
                .setCondition(QRCodeEnum.live_link.getCodeType().equalsIgnoreCase(type))
                .setContent(this::twoMethod));

        strategyFactoryList.add(new StrategyFactory<Consumer<WXMessgeBean>>()
                .setCondition(QRCodeEnum.work_qr_code.getCodeType().equalsIgnoreCase(type))
                .setContent(this::threeMethod));

        // 查找符合条件所有项
        List<StrategyFactory<Consumer<WXMessgeBean>>> collect = strategyFactoryList.stream().filter(StrategyFactory::getCondition).collect(Collectors.toList());
        if(io.jsonwebtoken.lang.Collections.isEmpty(collect)) log.error("引流关注服务号回调:角色类型错误");

        // 执行第一项对应的方法
        collect.get(0).getContent().accept(wxMessgeBean);
    }
}

/**
 * 存储条件与内容的二元组
 * @author dengzhiguang
 * @date 2023/5/7 11:59
 */
@Data
@Accessors(chain = true)
public class StrategyFactory<T> {

    private Boolean condition;

    private T content;

}

public enum QRCodeEnum {
    one("one"),
    two("two"),
    three("three")
    // ...
    ;
    
    private final String codeType;

    QRCodeEnum(String codeType) {
        this.codeType = codeType;
    }

    public String getCodeType() {
        return codeType;
    }
}

优化后:(字符串)

public class StrategyAndFactoryDemo {

    public static void main(String[] args) {
        // 二元组列表
        List<StrategyFactory<String>> strategyFactoryList = new ArrayList<>();

        String type = "xxx";
        // 添加条件与执行方法
        strategyFactoryList.add(new StrategyFactory<String>()
                        .setCondition(QRCodeEnum.give_product.getCodeType().equalsIgnoreCase(type))
                        .setContent("测试111"));

        strategyFactoryList.add(new StrategyFactory<String>()
                        .setCondition(QRCodeEnum.live_link.getCodeType().equalsIgnoreCase(type))
                        .setContent("测试222"));

        strategyFactoryList.add(new StrategyFactory<String>()
                        .setCondition(QRCodeEnum.work_qr_code.getCodeType().equalsIgnoreCase(type))
                        .setContent("测试333"));

        // 查找符合条件所有项
        List<StrategyFactory<String>> collect = strategyFactoryList.stream().filter(StrategyFactory::getCondition).collect(Collectors.toList());
        if(io.jsonwebtoken.lang.Collections.isEmpty(collect)) System.out.println("条件都不满足");

        // 打印第一项对应的结果
        System.out.println(collect.get(0).getContent());
    }
}


/**
 * 存储条件与内容的二元组
 * @author dengzhiguang
 * @date 2023/5/7 11:59
 */
@Data
@Accessors(chain = true)
public class StrategyFactory<T> {

    private Boolean condition;

    private T content;

}

public enum QRCodeEnum {
    one("one"),
    two("two"),
    three("three");

    private final String codeType;

    QRCodeEnum(String codeType) {
        this.codeType = codeType;
    }

    public String getCodeType() {
        return codeType;
    }
}