1. 什么是 Option(选项)
是Scala 提供的一种数据类型
用来封装一个数据 Option(var)
当var有值时 就返回 Some(var)
当var为空时 就返回 None
2. Option API
object OptionApi extends App {
//TODO 初始化 option 对象
val v1: Any = null
val v2: Any = 100
private val op1: Option[Any] = Option(v1)
private val op2: Option[Any] = Option(v2)
println(op1) // None
println(op2) // Some(100)
//TODO 获取 option中的值
//方式1: 直接获取 Some中的值(不推荐)
//println(op1.get) //java.util.NoSuchElementException: None.get
println(op2.get) // 100
//方式2: 通过模式匹配来获取值(推荐)
var op1v: Any = op1 match {
case Some(s) => s
case None => 999
}
var op2v: Any = op2 match {
case Some(s) => s
case None => 999
}
println(op1v) // 999
println(op2v) // 100
//方式3: 通过getOrElse方法获取值(推荐)
var op11 = op1.getOrElse(999)
var op22 = op2.getOrElse(999)
println(op11) // 999
println(op22) // 100
// TODO 判断 option 是否为null
private val opIfEmp1: Boolean = op1.isEmpty
private val opIfEmp2: Boolean = op2.isEmpty
println(opIfEmp1) // true
println(opIfEmp2) // false
}
3. 最佳实践
3.1 操作map 根据key 获取 value
object GetValueByKey extends App {
val map: Map[String, String] = Map("id" -> "1", "name" -> "奉先")
private val op1: Option[String] = map.get("id")
private val op2: Option[String] = map.get("id1")
//通过 key 获取value的值(key不存在时,获取默认值)
println(op1.getOrElse("default")) //1
println(map.get("name").getOrElse("default")) // 奉先
println(map.getOrElse("no", "default")) //default
}
3.2 处理方法中的 null
object GraceOperateNull extends App {
def getConcatStr(separator: String, argu: Any*): String = {
argu.map(
Option(_).getOrElse("None") // 判断 参数_ 是否为null,如果为null 给定默认值None
.toString).mkString(separator)
}
println(getConcatStr("_", "a", "b", "c", 1, 1.23, null))
//a_b_c_1_1.23_None
}