源码
sealed abstract class Option[+A] extends Product with Serializable
………………
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")
}
分析:
Option是一个抽象类
None 和 Some 继承Option
分析
val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1") // @1
val value2: Option[String] = myMap.get("key2") // @2
println(value1) // Some("value1")
println(value2) // None
对于@1和@2而言,无论取出来的结果是Some和None都可以赋值给Option类型的变量。因为Option是Some和None的父类。
对于@1而言,取出来的是Some
对于@2而言,取出来的是None
使用技巧
val myMap: Map[String, String] = Map("key1" -> "value1")
val value1: Option[String] = myMap.get("key1") //@1
val value2: Option[String] = myMap.get("key2") //@2
println(value1) // Some("value1")
println(value2) // None
print(value1.get) //right @3
print(value2.get) //err @4
println("isDefined**************") @5
println(value1.isDefined) // true
println(value2.isDefined) // false
println("isEmpty**************") //@6
println(value1.isEmpty) // false
println(value2.isEmpty) // true
println("nonEmpty**************") //@7
println(value1.nonEmpty) // true
println(value2.nonEmpty) // false
还是以上面的代码为例,然后我们再加点东西
我们已经知道,在@1中取出来的是值有可能是Some或者None,但是我们最终需要的肯定不是这两个东西,而是里面存的值。通过get方法(如@3和@4所示)就可以取出值了。
但是,对于None类型而言,是无法使用get方法,如@4所示的用法会报错,所以我们要事先判断我们的Option变量到底是None还是Some,能不能取出来值。而@6,@7,@8所示的操作可以帮助我们进行这一判断。
正确示例
val myMap: Map[String, String] = Map("key1" -> "value1")
val value1: Option[String] = myMap.get("key1") //@1
val value2: Option[String] = myMap.get("key2") //@2
var result:String = _
if(value1.isDefined)
{
result = value1.get
}
if(!value1.isEmpty) //这里使用了多重否定不便理解,官方推荐用isDefined
{
result = value1.get
}
if(value1.nonEmpty)
{
result = value1.get
}