你还在写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 错误
- 不要用 Optional 作为成员变量(不序列化,坑死)
- 不要用 Optional 作为方法参数(不规范)
- 不要 get()!
// 错误!如果空依然会抛 NPEoptional.get()// 正确!永远用 orElse/orElseGet/orElseThrow
📌 总结(背会这 4 句)
- 方法返回值用 Optional,彻底告别 null
- 获取值:orElseThrow / orElse / orElseGet
- 链式处理:map 链式转换,永不 NPE
- 条件过滤:filter 断言,业务更简洁
只要你按这个模式写,你的代码里将永远不会出现空指针!