使用枚举加Function(Java8)优化if else语句

可能在不自觉时,代码中就出现了很多的if和else语句,可能像下图一样
在这里插入图片描述
当然可能没有这么夸张,但是我见过比这还夸张的代码。网上有很多优化if else语句的方法,常用的我就不提了。这次主要是之前看EffectJava时,当时有一张对枚举讲的很是详细,结合Java8的function接口,感觉这也是优化if else判断的一个方案。
下面是代码:

/**
 * @author wangli66
 */
public enum DeSensionEnum {
    /** 中文名 */
    // Function 的 R apply(T t);
    CHINESE_NAME("CHINESE_NAME",(str)->{
        return str.toString().substring(0,1) + "**";
    }),
    /** 用户ID */
    USER_ID("USER_ID",(str)->{
        return str.toString().substring(0,1) + "**";
    }),
    /** 身份证号 */
    ID_CARD("ID_CARD",(str)->{
        return str.toString().substring(0, str.toString().length() - 4) + "****";
    }),
    
    private String name;
    /*脱敏方式*/
    private Function<String,String> deSensive;

    /**
     * 私有构造器
     * @param name
     * @param deSensive
     */
    private DeSensionEnum(String name,Function deSensive) {
        this.name = name;
        this.deSensive = deSensive;
    }

    public String getName() {
       return name;
    }

    /**
     * 应用
     * @param message
     * @return
     */
    public String getMsg(String message) {
    	// 我是为了演示方便写到这里了,实际上你可以在用的地方apply也行
        return deSensive.apply(message);
    }

}

测试代码

/**
 * @author wangli66
 */
public class TestEnumY {
    public static void main(String[] args) {
        String name = "ID_CARD";
        String id = "3123456789123456";
        // 获取到ID_CARD对应的脱敏方法的枚举
        DeSensionEnum deSensionEnum = DeSensionEnum.valueOf(name);
        if(deSensionEnum != null) {
            // 脱敏
            String msg = deSensionEnum.getMsg(id);
            System.out.println("脱敏后的数据:"+msg);
        }
    }
}
// 结果
// 脱敏后的数据:312345678912****

另外不得不说的是:

// 即使以后你又增加了其他的脱敏数据类型,我直接加下枚举,并实现下脱敏方法就行了,
// 主体的代码逻辑根本不需要去改变。
// 枚举的类型限制挺好的,能保证你传参正确性,要么枚举类型,要么null,也能减少不必要的判断代码。

看到这里,聪明的同学你可能灵光一闪。
在这里插入图片描述
搞什么啊,这不就是KV键值对嘛,我大map肯定也能这么做,是的,你猜对了。

// 和使用枚举的原理一样,key使用方法名,value使用接口,也可以达到这种效果。
// 下面上代码

/**
 * @author wangli66
 */
public class TestEnumMap {
    public static void main(String[] args) {
        // 初始化map
        Map<String, Function<String,String>> functionMap = new HashMap<>();
        functionMap.put("CHINESE_NAME",(str)->{
            return str.toString().substring(0,1) + "**";});
        functionMap.put("USER_ID",(str)->{
            return str.toString().substring(0,1) + "**";});
        functionMap.put("ID_CARD",(str)->{
            return str.toString().substring(0, str.toString().length() - 4) + "****";});

        // 测试
        String name = "ID_CARD";
        String id = "3123456789123456";
        // 拿到对应的方法,进行应用
        Function<String, String> function = functionMap.get(name);
        String msg = function.apply(id);
        System.out.println("脱敏后的数据:"+msg);

    }
}

// 结果
// 脱敏后的数据:312345678912****

不管是用哪一种方式,能够优化代码就可以了。使用Map这种方式时建议做成全局的。
欢迎指正,以及跪求三连一波!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章