Optional的使用

为啥滥用 != null 是个坑
你还记得你第一次写 Java 代码吗?那时候,每次调用一个方法,你都会写上 if (something != null)。老实说,这习惯就跟小时候写作文一样,开头必写“一个风和日丽的早晨”,死板得很。滥用 != null,不光让代码看着冗长,还容易藏 BUG。想想你那几十行的 if-else 判空,谁能一眼看出问题?
Java 8 给咱们带来了个神器——Optional。啥意思呢?就是咱们可以用 Optional 来包装那些可能为 null 的对象,不再需要满世界写判空。

1.获取对象里面的字段

// 对象判断
    public static void main1(String[] args) {
        User user = new User();
        user.setName("孙培洋");
        String userName = Optional.of(user)
                .map(User::getName)
                .orElse("");
        System.out.println(userName);
    }

2.获取配置参数

我们再来看一个获取配置参数的例子。通常情况下,我们会从配置文件中读取参数,如果参数不存在,我们可能会返回 null,然后在调用处进行判空处理:

// 传统方法,返回 null 并判空
public String getConfig(String key) {
    String value = configMap.get(key);
    if (value != null) {
        return value;
    } else {
        return null;
    }
}

public void useConfig() {
    String value = getConfig("someKey");
    if (value != null) {
        // 使用配置
    } else {
        // 使用默认值
    }
}

改用 Optional:

import java.util.Optional;

public Optional<String> getConfig(String key) {
    return Optional.ofNullable(configMap.get(key));
}

public void useConfig() {
    String value = getConfig("someKey")
                   .orElse("defaultValue");
    // 使用配置或默认值
}

3.少返回 null,多抛异常

有时候,咱们的确需要处理异常情况。很多初中级程序员喜欢返回 null 来表示异常情况。这其实是个坏习惯,应该多抛异常,少返回 null。为啥?因为 null 会让你的代码变得更脆弱,增加 NPE(NullPointerException)风险。
再举个栗子:

// 不推荐的返回 null 方式
public Person findPersonById(int id) {
    if (id < 0) {
        return null;
    }
    // 查找逻辑
}

// 调用时需要判空
Person person = findPersonById(-1);
if (person != null) {
    // 处理 person
}

推荐的方式是抛异常:

// 推荐的抛异常方式
public Person findPersonById(int id) {
    if (id < 0) {
        throw new IllegalArgumentException("ID 不能小于 0");
    }
    // 查找逻辑
}

// 调用时处理异常
try {
    Person person = findPersonById(-1);
    // 处理 person
} catch (IllegalArgumentException e) {
    // 处理异常
}

保护自己,别过度判空

// 滥用判空
if (obj != null && obj.getField() != null && obj.getField().getSubField() != null) {
    // 逻辑处理
}

其实,你可以通过设计让代码更健壮,减少这些判空。例如使用工厂模式确保对象不为 null,或者用 Optional 链式调用。

// 使用 Optional
Optional.ofNullable(obj)
        .map(Object::getField)
        .map(Field::getSubField)
        .ifPresent(subField -> {
            // 逻辑处理
        });
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值