Option用来表示可选的值,Option的实例是some实例或者none实例
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
val redColor: Option[String] = colors.get("red")
val redLower = redColor map { _.trim } filter { _.length != 0 } map { _.toLowerCase }
println(redLower getOrElse "")
//输出 #ff0000
val greenColor: Option[String] = colors.get("green")
//greenColor为Option[None],下面的语句并不会抛出异常
val greenLower = greenColor map { _.trim } filter { _.length != 0 } map { _.toLowerCase }
println(greenLower getOrElse "null value")
//输出 ""
val yelloColor: String = colors.get("yelloy").get
//yelloColor为None,需要做空值校验,否则下面的语句并不会抛出异常val yelloLower = yelloColor.toLowerCase
println(yelloLower)
//输出 java.util.NoSuchElementException: None.get
上述代码可以看出:
- Option 就是个容器,里面包含具体的Some值或者None
- 它可以被当做集合等来使用
map,flatMap,filter, 或者foreach操作 - 在复杂的调用链中,如果初始值是none,整个表达式的结果就是none,中间并不会因为空值而抛出异常
- 不需要做空值校验
Option类是一个抽象类,Some和None都继承了Option。Some代表有值,而None代表空值。
final case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}
case object None extends Option[Nothing] { def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}