scala的Option,Some,None

源码

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
            }
发布了85 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_37275456/article/details/90766585