模式匹配
模式匹配是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")
}