Scala集合:Option

在Scala中,Option[T]是给定类型的0或1个元素的容器。Option 是一个数据类型,用来表明一些数据的“有”或“无”,可以是Some[T]或None[T],其中T可以是任何给定类型。一个Some 实例可以存储任何类型的数据。None 对象表示数据的缺失。

例如,如果key存在,Scala Map总是返回值Some[],如果键不存在,则返回None。

val booksMap = Map(101 -> "Scala", 102 -> "Scala")
println(booksMap.get(101))
println(booksMap.get(105))

输出结果如下图所示:

getOrElse()方法用于从一个Option获取值,如果该值不存在,则返回默认值。例如:

println(booksMap.get(101).getOrElse("此图书不存在"))
println(booksMap.get(105).getOrElse("此图书不存在"))

输出结果如下图所示:

【示例】使用Option类型。

object demo {
  def main(args: Array[String]): Unit = {
    val a: Option[String] = Some("aaaa")
    println(a.get)

    val b: Option[String] = None
    // println(b.get)
    println(b.getOrElse(""))

    val c: Option[String] = Some(null)
    println(c.get)

    // Option类型的模式匹配
    val title:Option[String] = Some("老板")
    // val title:Option[String] = None
    title match{
      case Some(a) => println(s"title是$a。")   // 提取
      case None => println(s"没有title,屌丝一个。")
    }

    // 巧用map/foreach函数
    title.foreach(t => println(s"我的title是 = $t"))
  }
}

Option 数据类型与函数或方法一起使用,这个函数或方法可选地返回一个值。它可以返回Some(x) --这里x是实际返回的值,或者None 对象--该对象代表一个缺失的值。由一个函数返回的可选值可以使用模式匹配读取。

下面的代码演示了使用方法:

def colorCode(color:String): Option[Int] = {
    color match{
       case "red" => Some(1)
       case "blue" => Some(2)
       case "green" => Some(3)
       case _ => None
    }
};

val code = colorCode("orange");
code match{
    case Some(c) => println("code for orange is:" + c);
    case None => println("code not defined for orange");
}

Option 数据类型用来防止null 指针异常。在许多语言中,null 被用来表示数据缺失。在Scala 中联合使用强类型检查和Option 类型以防止null 引用错误。

Option类型用来表示可能存在也可能不存在的值。case class类Some包装了某个值,而样例对象None表示没有值。Option支持泛型。(Option的语法必须掌握,因为Spark源码中有大量的实例是关于Option语法的)

下面是一个使用了Option类型的代码:

def caseOps8: Unit = {
    
    def optionOps: Unit = {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo", "BeiJing" -> "通州")

      println(capitals.get("Japan") + "," + show(capitals.get("Japan")))
      println(capitals.get("BeiJing") + "," + show(capitals.get("India")))
    }

    def show(x: Option[String]) = x match {
      case Some(s) => s
      case None => "?"
    }

    optionOps
}
  
caseOps8

执行上面的代码,输出结果为:

Some(Tokyo),Tokyo 
Some(通州),?

Option类型提供有一个getOrElse方法。当没有值时,使用getOrElse()来访问值或使用默认值,可以得到友好的反馈。另外还提供了一个isEmpty()方法,用来判断Option中是否有值:

val a:Option[Int] = Some(5)
val b:Option[Int] = None

println("a.getOrElse(0): " + a.getOrElse(0) )
println("b.getOrElse(10): " + b.getOrElse(10) )

// 使用isEmpty()方法:
println("a.isEmpty: " + a.isEmpty )
println("b.isEmpty: " + b.isEmpty )

《PySpark原理深入与编程实战》