第10章 用Optional取代null
10.1.1 采用防御式检查减少NullPointerException
- 深层次递归的if语句块
- 过多的退出语句
10.1.2 null带来的种种问题
10.1.3 其他语言的替代品
- Groovy 安全导航操作符(Safe Navigation Operator)
- Haskell 的 Maybe
- Scala 的 Option[T]
10.2 Optional入门
DIFF
- null
- Optional.empty()
10.3 应用Optional的几种模式
10.3.1 创建Optional对象
Optional.empty() Optional.of() Optional.ofNullable()
10.3.2 使用map从Optional对象中提取和转换值
注意:map与flatmap对比
10.3.3 使用flatmap链接Optional对象
你永远不要忘记语言的首要目的是沟通。
Optional无法序列化,设计的初衷仅仅是要支持能返回Optional对象的语法。[P212]
注意:
- 不能作为类的字段
这点尤为重要,即类要纯粹。如果是POJO就原始类型就可以了,如果是领域对象,则更不应该使用Optional作为field
- Optional不能作为方法参数
另一种不太适合使用Optional的情况是将该类型作为方法或者构造函数的参数,这将导致不必要的代码复杂化。
User user = new User("john@gmail.com", "1234", Optional.empty());
相反,使用方法重载(method overloading)来处理非强制性参数要方便得多。
10.3.4 默认行为及解引用Optional对象
- get()
- orElse()
- orElseGet()
- orElseThrow
- ifPresent()
10.3.5 两个Optional对象的组合
使用不解包的方式组合,运用flatMap、map
10.3.6 使用filter剔除特定的值
10.4 使用Optional的实战示例
10.4.1 使用Optional封装可能为null的值
例如:
Optional<Object> value = Optional.ofNullable(map.get("key"));
10.4.2 异常与Optional的对比
当抛出异常的时候抛出Optional.empty()
基础类型的Optional对象,以及为什么避免使用它们
注意对比Optional与Stream的通用模式。