你还在写return null还在满屏if(obj null)Optional 不是简单的非空判断它是 Java 官方的空安全设计范式能让代码优雅、无空指针、可读性拉满。这篇直接给你4 种企业级高级用法彻底替代 null看完直接重构代码先记住一句话任何可能为空的方法坚决不返回 null一律返回 Optional坏代码publicUsergetUserById(Longid){returnnull;// 垃圾调用方必踩空指针}好代码publicOptionalUsergetUserById(Longid){returnOptional.empty();// 安全无空指针}一、高级模式 1安全获取值3 种标准写法彻底告别ifNull一行搞定非空判断。1.1 为空则抛异常最常用// 空则抛自定义异常UseruseruserService.getUserById(id).orElseThrow(()-newBusinessException(用户不存在));1.2 为空则返回默认值// 空则返回默认对象UseruseruserService.getUserById(id).orElse(newUser());1.3 为空则动态生成懒加载// 空才执行方法性能更高UseruseruserService.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直接返回空。// 传统写法地狱判空Stringcitynull;if(user!null){if(user.getAddress()!null){cityuser.getAddress().getCity();}}// Optional 链式写法一行无敌StringcityuserService.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绝不返回 nullpublicOptionalUsergetUserById(Longid){UseruseruserMapper.selectById(id);// 包装成 Optional空→empty非空→ofNullablereturnOptional.ofNullable(user);}}调用方优雅到爆炸// 1. 获取不存在抛异常UseruseruserService.getUserById(id).orElseThrow(()-newRuntimeException(用户不存在));// 2. 链式获取属性StringusernameuserService.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 断言业务更简洁只要你按这个模式写你的代码里将永远不会出现空指针