58_Option数据结构 及 优雅的处理null问题
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 }