方法别再返回 null 了!Optional的4种高级模式
2026/6/6 9:27:56 网站建设 项目流程

你还在写return null?还在满屏if(obj == null)
Optional 不是简单的非空判断!它是 Java 官方的空安全设计范式,能让代码优雅、无空指针、可读性拉满。

这篇直接给你4 种企业级高级用法,彻底替代 null,看完直接重构代码!


先记住一句话

任何可能为空的方法,坚决不返回 null,一律返回 Optional

坏代码:

publicUsergetUserById(Longid){returnnull;// 垃圾!调用方必踩空指针}

好代码:

publicOptional<User>getUserById(Longid){returnOptional.empty();// 安全!无空指针}

一、高级模式 1:安全获取值(3 种标准写法)

彻底告别ifNull一行搞定非空判断

1.1 为空则抛异常(最常用)

// 空则抛自定义异常Useruser=userService.getUserById(id).orElseThrow(()->newBusinessException("用户不存在"));

1.2 为空则返回默认值

// 空则返回默认对象Useruser=userService.getUserById(id).orElse(newUser());

1.3 为空则动态生成(懒加载)

// 空才执行方法,性能更高Useruser=userService.getUserById(id).orElseGet(()->createDefaultUser());

二、高级模式 2:链式消费(不为空才执行)

空不执行,非空才执行,优雅到极致!

// 只有 user 不为空,才会执行里面逻辑userService.getUserById(id).ifPresent(user->{// 执行业务逻辑user.setStatus(1);userRepository.update(user);});

升级版:空也处理

userService.getUserById(id).ifPresentOrElse(user->log.info("找到用户"),// 非空执行()->log.info("用户不存在")// 空执行);

三、高级模式 3:链式转换(map/flatMap 无空穿透)

链式调用永远不怕空指针!中间任何一步为 null,直接返回空。

// 传统写法(地狱判空)Stringcity=null;if(user!=null){if(user.getAddress()!=null){city=user.getAddress().getCity();}}// Optional 链式写法(一行无敌)Stringcity=userService.getUserById(id).map(User::getAddress)// 转换.map(Address::getCity)// 继续转换.orElse("未知城市");// 最终兜底

任何一步为空,都不会 NPE!


高级模式 4:过滤 + 断言(filter 条件判断)

满足条件才保留,不满足则变空,非常适合业务校验。

userService.getUserById(id).filter(user->user.getStatus()==1)// 只保留状态=1的用户.ifPresentOrElse(u->log.info("用户有效"),()->log.info("用户无效或不存在"));

🔥 终极实战:返回 Optional 的标准业务方法(企业级模板)

以后所有查询方法都这么写!

@ServicepublicclassUserService{// 重点:返回 Optional,绝不返回 nullpublicOptional<User>getUserById(Longid){Useruser=userMapper.selectById(id);// 包装成 Optional:空→empty,非空→ofNullablereturnOptional.ofNullable(user);}}

调用方(优雅到爆炸)

// 1. 获取,不存在抛异常Useruser=userService.getUserById(id).orElseThrow(()->newRuntimeException("用户不存在"));// 2. 链式获取属性Stringusername=userService.getUserById(id).map(User::getUsername).orElse("匿名");

🚫 3 个绝对不要犯的 Optional 错误

  1. 不要用 Optional 作为成员变量(不序列化,坑死)
  2. 不要用 Optional 作为方法参数(不规范)
  3. 不要 get()!
    // 错误!如果空依然会抛 NPEoptional.get()// 正确!永远用 orElse/orElseGet/orElseThrow

📌 总结(背会这 4 句)

  1. 方法返回值用 Optional,彻底告别 null
  2. 获取值:orElseThrow / orElse / orElseGet
  3. 链式处理:map 链式转换,永不 NPE
  4. 条件过滤:filter 断言,业务更简洁

只要你按这个模式写,你的代码里将永远不会出现空指针!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询