Java中检查HashMap键是否存在时如何避免过多if-else判断
解决方案
首先需要确认:你的Product类需要先补全无参构造方法,以及所有属性对应的setter方法,否则无法完成属性赋值。
方案1:原生Java8+ 极简优化(最适合新手,无额外依赖)
Java 8开始Map接口提供了getOrDefault内置方法,可以直接替代你写的if-else判断,一行完成单个字段赋值,逻辑和原有代码完全一致,代码量直接缩减70%:
public class Main { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("name", "iPhone"); map.put("productId", "2342343"); map.put("productSerial", "FG44D#KLD"); map.put("productDesc", "iPhone plus"); map.put("productPrice", "1500"); Product product = new Product(); // 直接用getOrDefault替换所有if-else逻辑 product.setName(map.getOrDefault("name", "NOT_EXIST")); product.setProductId(map.getOrDefault("productId", "NOT_EXIST")); product.setProductSerial(map.getOrDefault("productSerial", "NOT_EXIST")); product.setProductDesc(map.getOrDefault("productDesc", "NOT_EXIST")); product.setProductPrice(map.getOrDefault("productPrice", "NOT_EXIST")); } }
该方案没有额外学习成本,也不需要引入第三方依赖,和你原有实现逻辑完全等价。
方案2:反射通用实现(适合字段多、后续会扩展字段的场景)
如果后续Product还会新增大量字段,挨个写set方法依然冗余,可以写一个通用的赋值工具方法,利用反射自动匹配字段赋值,后续新增字段不需要修改赋值逻辑:
import java.lang.reflect.Field; import java.util.Map; public class MapToBeanUtils { public static <T> T mapToBean(Map<String, String> map, Class<T> clazz) throws Exception { // 实例化目标对象 T obj = clazz.getDeclaredConstructor().newInstance(); // 遍历目标类的所有属性 for (Field field : clazz.getDeclaredFields()) { // 开启私有属性访问权限 field.setAccessible(true); // 从map取值,不存在就用默认值NOT_EXIST String value = map.getOrDefault(field.getName(), "NOT_EXIST"); field.set(obj, value); } return obj; } }
调用时仅需一行代码即可完成所有字段赋值:
Product product = MapToBeanUtils.mapToBean(map, Product.class);
方案3:第三方工具类实现(项目已引入对应依赖的场景)
如果你的项目已经引入了Apache Commons BeanUtils或者Spring BeanUtils,可以直接用工具类的内置方法完成赋值,之后统一处理空值即可:
// Apache Commons BeanUtils 写法 BeanUtils.populate(product, map); // 后续遍历Product类的所有字段,把null值统一替换为NOT_EXIST即可
该方案适合已经有相关依赖的项目,不建议为了这个功能单独引入第三方依赖。
内容的提问来源于stack exchange,提问作者Mike Marsh
相关产品推荐
相关产品推荐

