关于java:Java-中-Optional-的使用技巧

不要给 Optional 变量赋值为 null

如果你有一个变量申明为 Optional,则不要给它赋值为 null:

public Optional<Insurance> getInsurance() {
    // 这里不应该给 Optional 变量赋值为 null,而应该间接赋值为 Optional.empty();
    Optional<Insurance> insurance = null;
    return insurance;
}

不要间接调用 Optional 的 get 办法

Optional<Insurance> insuranceOpt = InsuranceService.getInsurance():
// 这里不应该间接调用 get 办法,而应该在调用 get 办法之火线调用 isPresent() 办法进行判断
Insurance insurance = insuranceOpt.get();

if (insuranceOpt.isPresent()) {
    // do something
} else {
    // do something
}

应用 orElse() 办法来获取默认值

public String getName() {
    Optional<String> name = NameService.getName();
    if (name.isPresent()) {
        return name.get();
    } else {
        return DEFAULT_VALUE;
    }
    
    // 下面的代码能够简化为一行
    return NameService.getName().orElse(DEFAULT_VALUE);
}

不要应用 orElse() 办法来获取须要计算的值,而应该应用 orElseGet() 办法来获取

public Optional<Insurance> getFromCache(String id) {
    // 从缓存中获取
}

public Insurance getFromDb(String id) {
    // 从数据库中获取
}

public Optional<Insurance> getInsurance(String id) {
    // 应用 orElse() 不论是否从缓存中获取到数据都会执行从数据库中查问的逻辑
    return getFromCache(id).orElse(getFromDb(id));
    // 应该批改为如下的形式,这样的话只有当缓存外面获取不到值的时候,才会从数据库中获取
    return getFromCache(id).orElseGet(() -> getFromDb(id));
}

参考

12 recipes for using the Optional class as it’s meant to be used (oracle.com)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理