Java中避免重复代码,高效处理Getter返回值转Optional的空值检查
解决方案
首先可以用泛型工具方法统一处理空值转Optional的逻辑,彻底避免为不同类型重复编写冗余代码:
private <T> Optional<T> toOptional(T value) { return Optional.ofNullable(value); }
这个方法能接收任意类型的参数,参数为null时返回Optional.empty(),否则返回包含该值的Optional,完美复用所有类型的空值判断逻辑。
针对age字段的特殊场景(String转Integer),可以再封装一个兼顾空值和转换异常的专用方法:
private Optional<Integer> stringToOptionalInt(String str) { try { return toOptional(str).map(Integer::valueOf); } catch (NumberFormatException e) { // 字符串不是合法数字时也返回空Optional return Optional.empty(); } }
现在构建不可变对象的代码就可以简化成:
MyImmutablePerson.builder() .name(myPerson.getName()) .age(stringToOptionalInt(myPerson.getAge())) .address(toOptional(myPerson.getAddress())) .build();
如果项目已引入Guava或Apache Commons Lang,也可以用现成工具类进一步简化:
- Guava组合写法:
Optional<Integer> ageOpt = Optional.fromNullable(Ints.tryParse(myPerson.getAge())); - Apache Commons Lang写法:
Optional<String> addressOpt = StringUtils.isNotBlank(myPerson.getAddress()) ? Optional.of(myPerson.getAddress()) : Optional.empty();
另外注意你原有的checkNullAge方法存在两处错误:
age.isNull()是错误写法,正确判断空值应该用age == null或Objects.isNull(age)- 直接返回
Optional.of(age)类型不匹配,age是String类型,目标是Optional<Integer>,必须做类型转换
内容的提问来源于stack exchange,提问作者mitriola
相关产品推荐
相关产品推荐

