如何使用Java 8 Lambda结合Map重构if语句校验代码
使用Map与Lambda重构字段校验代码
原代码通过重复的if判断校验字段非空,复用性差且冗余。用Map存储字段提取逻辑和对应标识,结合Lambda遍历校验,能大幅简化代码,后续新增字段仅需在Map中添加条目即可。
重构方案一:直接映射字段获取器与错误信息
适合需要自定义不同错误信息的场景:
private void validateUserFields(User user) { Map<Supplier<Object>, String> fieldValidations = Map.of( user::getName, "The user's name cannot be null", user::getLastName, "The user's lastName cannot be null", user::getDni, "The user's dni cannot be null", user::getVehicle, "The user's vehicle cannot be null" ); fieldValidations.forEach((fieldSupplier, errorMsg) -> { if (fieldSupplier.get() == null) { throw new RuntimeException(errorMsg); } }); }
重构方案二:统一错误信息格式
如果错误信息格式固定,可进一步简化,避免重复编写字符串:
private void validateUserFields(User user) { Map<Function<User, Object>, String> fieldValidations = Map.of( User::getName, "name", User::getLastName, "lastName", User::getDni, "dni", User::getVehicle, "vehicle" ); fieldValidations.forEach((fieldExtractor, fieldName) -> { if (fieldExtractor.apply(user) == null) { throw new RuntimeException(String.format("The user's %s cannot be null", fieldName)); } }); }
兼容Java 8的写法
若项目基于Java 8,Map.of()不可用,改用HashMap初始化:
private void validateUserFields(User user) { Map<Function<User, Object>, String> fieldValidations = new HashMap<>(); fieldValidations.put(User::getName, "name"); fieldValidations.put(User::getLastName, "lastName"); fieldValidations.put(User::getDni, "dni"); fieldValidations.put(User::getVehicle, "vehicle"); fieldValidations.forEach((fieldExtractor, fieldName) -> { if (fieldExtractor.apply(user) == null) { throw new RuntimeException(String.format("The user's %s cannot be null", fieldName)); } }); }
内容的提问来源于stack exchange,提问作者MATEO VALENCIA MINOTA
相关产品推荐
相关产品推荐

