Scala学习-模式匹配

模式匹配

模式匹配是scala的一大特性,有点像增加版的switch-case。
在Scala代码中无处不在:用于合并条件执行、解构(destructuring) 、在构造中造型。

def getSex(name:Any){
    name match {
        //匹配字符串
          case "rony" => println(“male”)
          case "lina" => println(“female”)
          //匹配元组
          case ("rony","lina") => println(name)
          //匹配列表
          case List("rony","lina") => println(name)
          //匹配自定义类
          case User(u) => println(u.name)
          //匹配通配符
          case _ =>
    }
  }

《Effective Scala》中建议匹配通配符时改为 case other => 可读性更高

Options

写多了java得同学都见多了NullPointerException,一不小心就会出现这种低级错误,Scala中有一种Option类型,是一个表示有可能包含值的容器。空(None)或满(Some(value))二选一。

《Effective Scala》中提出Option提供了使用null的另一种安全选择,应该尽可能的替代null。它是一个集合(最多只有一个元素)并用集合操所修饰,尽量用Option。
但它也提示了不要过度使用Option: 如果有一个明确的缺省值——一个Null对象——直接用Null而不必用Option

def getUser(user_id: Long):User = {
    //userDao.getUser()返回Option[User]类型
    val user = userDao.getUser(user_id)
    user match {
        case Some(u) => u
        case None => //不存在用户
    }
}

有人说这不和if判断null一样么,根本没有什么优势,个人认为这只是更像一种警示,当习惯后,看到方法的返回值是Option时,心里应该明白这个可能是要做空处理的。
Option里面还有一些的好用方法,例如getOrElse(),如果没有取到则给一个默认值,

def getUserName(user_id: Long):String = {
    //userDao.getUserName()返回Option[String]类型
    val user = userDao.getUserName(user_id)
    user.getOrElse("rony")
}