第10章 用Optional取代null

第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]

注意:

  1. 不能作为类的字段

这点尤为重要,即类要纯粹。如果是POJO就原始类型就可以了,如果是领域对象,则更不应该使用Optional作为field

  1. 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的通用模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值