使用枚舉加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這種方式時建議做成全局的。
歡迎指正,以及跪求三連一波!!!

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