本文介绍Scala中的Option容器。
1、基本知识
Scala中Option是一个容器,长度为1,保存的是空的或者给定类型的数值。
也就是说Option是Scala用来解决空值None、null、0这种表示“什么都没有”的特殊场景的方法。
Option也被看成Scala提供的一种函数方法,Option或Option[T],T是Type数据类型。
2、Option的定义/声明方法
2.1 声明一个非空的Option类型
// in scala
val msg0 : Option[String] = Some("Option is a Scala collection")
println(msg0)
2.2 声明一个空的Option类型
// in Scala
val msg1 : Option[String] = None
println(msg1)
3、判断Option类型的数据是不是空的
Option.isEmpty方法用来判断Option类型的数据值是不是空的
// in scala
object Test {
def main(args: Array[String]) {
val x: Option[Int] = Some(5)
val y: Option[Int] = None
println("Check X is Empty: " + x.isEmpty)
println("Check Y is Empty: " + y.isEmpty)
}
}
4、使用Option来解决空值问题的场景
4.1 和 getOrElse() 一起使用,利用Option设置默认值,即解决查找返回结果为None的问题
//in scala
object Test {
def main(args: Array[String]) {
val stud = Student(14, "Chris", 45f, None)
println(stud.gender.getOrElse("Gender not specified")) //和getOrElse一起使用置查询结果是None的默认值
println(stud.Name) //Name是普通String类型,没有getOrElse的方法可调用
}
}
case class Student(
id: Int,
Name: String,
marks: Float,
gender: Option[String]) //定义Option类型
4.2 和get()一起使用,解决如Map中查询key不存在的问题,返回None
//in scala
object Test {
def main(args: Array[String]) {
val students = Map(1 -> Student(10, "John", 62.5f, Some("male")),
2 -> Student(12, "Adam", 70.5f, Some("female")))
def findById(id: Int): Option[Student] = students.get(id)
val st1 = findById(2)
println(st1)
if (st1.isDefined) {
println(st1.get.id)
println(st1.get.Name)
println(st1.get.marks)
}
val st2 = findById(3)
println(st2)
}
}
case class Student(
id: Int,
Name: String,
marks: Float,
gender: Option[String])
4.3 和模式匹配的方法一起使用来解决查询为None的问题
//in scala
object Test {
def main(args: Array[String]) {
val student = Map(12 -> "Anderson", 14 -> "Reena")
println("Student Name with id 12 : " + displaykey(student.get(12)))
println("Student Name with id 16 : " + displaykey(student.get(16)))
}
def displaykey(aName: Option[String]) = aName match {
case Some(t) => t
case None => "?"
}
}
5、Option的其他用法
.isDefined 方法判断Option是一个Some实例
.orNull 方法 ,如果值是空的返回null,否则返回其值
Option.get 方法,获取其值
//in scala
object Test {
def main(args: Array[String]) {
val x: Option[Int] = Some(5)
val y: Option[Int] = None
println(x.isDefined)
println(y.isDefined) //如果Option是一个Some实例则返回true,否则返回false
println(x.orNull) //如果值是空的返回null,否则返回其值
println(y.orNull) //如果值是空的返回null,否则返回其值
println(x.get) //x是Option类型,有get方法可以获取值。y是None类型,没有get方法获取值。
}
}