Java 8 Optional使用:原有非空校验逻辑转换疑问
用Optional重构你的AuthCheck逻辑
嘿,我来帮你把这段空检查的代码用Optional优雅地重构一下~先理清楚你原来的逻辑:构造函数需要确保传入的User非空,且User的stuff既不是null也不是空集合,否则抛出对应异常,最后把User赋值给成员变量。
重构后的完整代码
首先,不建议把Optional作为类的成员变量(Optional的设计初衷是处理方法返回值或参数,而非存储状态),所以成员变量还是用原始的UserOptional类型。下面是完整的重构版本:
import java.util.Optional; import java.util.List; public class AuthCheckOptional { // 成员变量用原始类型,因为构造函数已经保证非空 private final UserOptional user; public AuthCheckOptional(Optional<UserOptional> userOptional) throws Exception { this.user = userOptional // 第一步:处理user为空的情况,直接抛异常 .orElseThrow(() -> new Exception("No user!")); // 第二步:处理user的stuff为空或null的情况 Optional.ofNullable(this.user.getStuff()) .filter(stuff -> !stuff.isEmpty()) .orElseThrow(() -> new Exception("User has no stuff")); } } // 假设的UserOptional类(你实际的类结构可能类似) class UserOptional { private List<String> stuff; public List<String> getStuff() { return stuff; } // 这里可以添加构造器、setter等方法 }
更紧凑的链式写法
如果你喜欢更连贯的链式调用,也可以把两步检查合并在一起,让代码更简洁:
public AuthCheckOptional(Optional<UserOptional> userOptional) throws Exception { this.user = userOptional // 先检查user非空,再嵌套检查stuff的状态 .map(user -> { Optional.ofNullable(user.getStuff()) .filter(stuff -> !stuff.isEmpty()) .orElseThrow(() -> new Exception("User has no stuff")); return user; }) .orElseThrow(() -> new Exception("No user!")); }
额外的优化建议
如果你的UserOptional类可以修改,建议把getStuff()方法的返回值改成Optional<List<String>>,这样就不用手动用Optional.ofNullable()包装了,代码会更简洁:
class UserOptional { private List<String> stuff; public Optional<List<String>> getStuff() { return Optional.ofNullable(stuff); } }
此时构造函数里的stuff检查可以简化为:
this.user.getStuff() .filter(stuff -> !stuff.isEmpty()) .orElseThrow(() -> new Exception("User has no stuff"));
这样重构后的代码既保留了你原来的业务逻辑,又充分利用了Optional的特性,避免了繁琐的null判断,代码可读性也更高~
内容的提问来源于stack exchange,提问作者Taobitz
相关产品推荐
相关产品推荐

