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
}

 

posted @ 2022-07-07 15:56  学而不思则罔!  阅读(113)  评论(0)    收藏  举报