4.8 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))

输出结果如下图所示:

img

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

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

输出结果如下图所示:

img

【示例】使用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 )
© 版权声明
THE END
喜欢就支持一下吧
点赞261赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容