使用枚举加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这种方式时建议做成全局的。
欢迎指正,以及跪求三连一波!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术