文章目录334. Java Stream API - 正确使用 Java Optional 的七大黄金法则 消费方法讲解 如何消费 Optional 的内容✅ ifPresent(ConsumerT)✅ ifPresentOrElse(ConsumerT, Runnable) 七条 Optional 正确使用的黄金法则✅ 规则 #1**绝对不要用 null 表示 Optional 没有值**✅ 规则 #2**除非你非常确定别用 get() 或 orElseThrow()**✅ 规则 #3**尽量避免用 ifPresent() / get() / orElseThrow() 作流程控制**✅ 规则 #4**不要用 Optional 来替代 null 判断**✅ 规则 #5**不要在以下位置使用 Optional**✅ 规则 #6**不要对 Optional 做身份比较或同步操作**✅ 规则 #7**Optional 不是可序列化的对象** 总结口诀便于记忆334. Java Stream API - 正确使用 Java Optional 的七大黄金法则 消费方法讲解 如何消费 Optional 的内容Optional提供了两个很实用的方法可以“消费”它内部的值如果有✅ifPresent(ConsumerT)这个方法的语义是“如果有值就处理它”。就像Stream.forEach()的缩小版。 示例OptionalStringoptionalOptional.of(Hello);optional.ifPresent(value-System.out.println(Value is: value));输出Valueis:Hello如果optional是空的啥也不发生。适合做“可有可无的值的处理”。✅ifPresentOrElse(ConsumerT, Runnable)Java 9加入的新方法。 语义是如果有值 → 执行第一个参数Consumer如果没值 → 执行第二个参数Runnable 示例OptionalStringoptionalOptional.empty();optional.ifPresentOrElse(value-System.out.println(Value is: value),()-System.out.println(No value present!));输出Novalue present! 用于在一个地方处理“有”和“无”的两种情况更清晰更优雅。 七条 Optional 正确使用的黄金法则✅ 规则 #1绝对不要用null表示Optional没有值错误做法 ❌OptionalStringoptionalnull;// 千万别这样正确做法 ✅OptionalStringoptionalOptional.empty();// 空的 optional 理由Optional的存在就是为了避免null。如果你用null表示Optional反而制造了更大的风险✅ 规则 #2除非你非常确定别用get()或orElseThrow()错误用法风险巨大❌Stringvalueoptional.get();// 如果是 empty就抛异常更安全的做法 ✅optional.ifPresent(val-System.out.println(Found: val));或者配合orElse()、orElseGet()Stringvalueoptional.orElse(default);⚠️ 仅在你百分之百确信Optional 一定有值的地方才使用get()或orElseThrow()。✅ 规则 #3尽量避免用ifPresent()/get()/orElseThrow()作流程控制 不推荐的ifPresent else模式if(optional.isPresent()){doSomething(optional.get());}else{doSomethingElse();} 更推荐optional.ifPresentOrElse(this::doSomething,this::doSomethingElse);更函数式、更现代化、更清晰。✅ 规则 #4不要用Optional来替代null判断错误使用 ❌OptionalStringoptionalOptional.ofNullable(name);if(optional.isPresent()){// do something}更直接做法 ✅if(name!null){// do something}Optional是为了作为方法返回值的契约不是为了你写if判断时图省事。✅ 规则 #5不要在以下位置使用 Optional❌ 错误用法原因Optional作为字段不序列化且使用成本高Optional作为方法参数调用者很不方便传入Optional放在集合中组合复杂度高性能低Optional做为Map值造成空值和逻辑判断的双重复杂度正确做法 ✅方法参数用Nullable或javadoc说明字段用普通引用 文档约定✅ 规则 #6不要对 Optional 做身份比较或同步操作错误示例 ❌if(optional1optional2){...}// 引用比较没有意义更正确做法 ✅if(optional1.equals(optional2)){...}同步也是危险的synchronized(optional){...}// 千万别这么写原因Optional 是值对象不该参与同步、锁等“身份敏感操作”。✅ 规则 #7**Optional不是可序列化的对象**在 Java 的设计中Optional明确不是Serializable。因此不能用于网络传输对象存储结构JSON序列化替代方法 ✅使用null 文档说明自定义 Optional 类型并实现Serializable仅在必要场景下 总结口诀便于记忆 可选非空不用 null 拿值之前先判断✋ 少用 get多用 map 不用 Optional 做成员 不要同步或比身份。