避免null的使用
大多数语言都有一个特殊的关键字或者对象表示一个对象的引用是“无”,在java里,它是null。在java里,null是一个关键字,不是一个对象,所以对它调用任何方法都是非法的。但是为什么要在程序员希望返回一个对象的时候,返回一个关键字呢?
Scala的Option类型
为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。在没有值的时候,使用None,它是Option的一个子类;在有值的时候,就用Some来包含这个值,它也是Option的一个子类
例子1,认识Option的存在
scala> val map = Map("France"->"Paris", "Japan"->"Tokyo", "China"->"Beijing")
map: scala.collection.immutable.Map[String,String] = Map(France -> Paris, Japan -> Tokyo, China -> Beijing)
scala> map get "France"
res0: Option[String] = Some(Paris)
scala> map get "France2"
res1: Option[String] = None
从map里取值,如果取到了,则返回一个Some,如果没取到,则返回一个None
用途1,避免判断空
Option的一个非常惯用的做法是,把Option当成是一个集合看待,集合的大小是1或者是0,所以可以把map,filter,foreach等操作用在Option上
val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")
这是Option官方给的一段代码,意思是从request中取出一个name值(但是name值可能是不存在的),然后对这个值去空格,去掉空值,转换为大写等一系列操作,最后拿到结果。
可以看到,这里没有任何if (name == null ) 或者 if (name.length == 0) 等这样的if语句,全是使用了scala推荐的函数式编程的写法,这种写法看起来更加scala,更简洁流畅,推荐这样写
用途2,使用模式匹配
使用模式匹配也能达到避免使用if的效果,下面再贴一个官方的代码
val nameMaybe = request getParameter "name"
nameMaybe match {
case Some(name) =>
println(name.trim.toUppercase)
case None =>
println("No name value")
}
有值时,走Some(name) 后的逻辑,没有值的时候,走None 的逻辑,看起来也是非常明确易懂