Java 11中简化Map键空值校验与实体赋值代码的方法
简化Map转实体的空值判断(JDK 11)
嘿,我完全懂你这种感受——一堆重复的if null判断看着真的很冗余,代码显得特别啰嗦。针对JDK 11,我给你几个实用的简化方案,你可以根据自己的场景来选:
方案1:用Optional链式调用替代if判断
JDK 8开始引入的Optional正好能解决这种空值处理的场景,JDK 11也完全支持。我们可以把每个字段的赋值逻辑改成链式调用,既简洁又直观:
@Override public AfdLoginDTO toEnt(Map<String, Object> map) { AfdLoginDTO afdLogin = new AfdLoginDTO(); // 处理username字段 Optional.ofNullable(map.get("username")) .map(Object::toString) // 把Object转成String .ifPresent(afdLogin::setUsername); // 只有值非空时才调用set方法 // 处理nt_id字段 Optional.ofNullable(map.get("nt_id")) .map(Object::toString) .ifPresent(afdLogin::setClientId); return afdLogin; }
这样一来,原本的if判断就被Optional的链式调用替代了,代码结构更清晰,也避免了重复的null检查逻辑。
方案2:提取通用工具方法(适合字段较多的场景)
如果你的实体类有很多字段要处理,上面的写法还是会有重复代码。这时候可以提取一个通用的工具方法,把重复的逻辑封装起来:
// 封装一个通用的空值处理+赋值方法 private <T> void setFieldIfPresent(Map<String, Object> map, String key, Consumer<String> setter) { Optional.ofNullable(map.get(key)) .map(Object::toString) .ifPresent(setter); } @Override public AfdLoginDTO toEnt(Map<String, Object> map) { AfdLoginDTO afdLogin = new AfdLoginDTO(); // 每个字段只需要一行代码调用工具方法 setFieldIfPresent(map, "username", afdLogin::setUsername); setFieldIfPresent(map, "nt_id", afdLogin::setClientId); return afdLogin; }
这个方案的好处是,不管你有多少字段,赋值逻辑都只需要一行代码,后期维护也更方便——如果要修改转换逻辑(比如加个trim),只需要改工具方法就行,不用每个字段都改。
额外小提示(可选)
如果你的项目允许引入第三方库,像MapStruct这种对象映射框架可以自动帮你处理空值、类型转换这些问题,甚至连映射代码都不用自己写。不过如果只想用JDK原生的能力,上面两个方案就完全够用啦。
内容的提问来源于stack exchange,提问作者ufff treee
相关产品推荐
相关产品推荐

