Scala集合:Option
在Scala中,Option[T]是给定类型的0或1个元素的容器。Option 是一个数据类型,用来表明一些数据的“有”或“无”,可以是Some[T]或None[T],其中T可以是任何给定类型。一个Some 实例可以存储任何类型的数据。None 对象表示数据的缺失。
例如,如果key存在,Scala Map总是返回值Some[
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 )