Scala中提供null值,但尽量避免使用,除非要与Java交互。(在 Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的,这与函数式编程的scala不符合)。Scala 试图通过摆脱 null 来解决这个问题,并提供自己的类型用来表示一个值是可选的(有值或无值), 这就是 Option[A] 特质。
1. Option,Some,None
Option[A]
是一个类型为 A 的可选值的容器: 如果值存在, Option[A]
就是一个 Some[A]
,如果不存在, Option[A]
就是对象 None
。Some与None是Option的两个子类!
2. 使用场景
scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。例如集合Map的get方法:
val map = Map("Japan"->"Tokyo", "China"->"Beijing")
println(map.get("China"))
println(map.get("France"))
println(map.get("Japan"))
在模式匹配中也可以使用Option类型
val nameMaybe:Option[String] = Some("tom")
nameMaybe match {
case Some(_) => println("yes")
case None => println("No name")
}
3. 创建Option
4. 使用Option
case class User(
id: Int,
firstName: String,
lastName: String,
age: Int,
gender: Option[String]
)
object UserRepository {
private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
2 -> User(2, "Johanna", "Doe", 30, None))
def findById(id: Int): Option[User] = users.get(id)
def findAll = users.values
}
4.1 默认值getOrElse
很多时候,在值不存在时,需要进行回退,或者提供一个默认值。 Scala 为 Option 提供了 getOrElse 方法,以应对这种情况
val user = User(2, "Johanna", "Doe", 30, None)
println("Gender: " + user.gender.getOrElse("not specified")) // will print "not specified"
4.2 模式匹配
val user = User(2, "Johanna", "Doe", 30, None)
user.gender match {
case Some(gender) => println("Gender: " + gender)
case None => println("Gender: not specified")
}
4.3 作为集合的Option
Option 是类型 A 的容器,更确切地说,你可以把它看作是某种集合, 这个特殊的集合要么只包含一个元素,要么就什么元素都没有。虽然在类型层次上, Option 并不是 Scala 的集合类型, 但,凡是你觉得 Scala 集合好用的方法, Option 也有, 你甚至可以将其转换成一个集合,比如说 List 。
4.4 for语句
现在,你已经知道 Option 可以被当作集合来看待,并且有 map 、 flatMap 、 filter 这样的方法。 可能你也在想 Option 是否能够用在 for 语句中,答案是肯定的。 而且,用 for 语句来处理 Option 是可读性最好的方式,尤其是当你有多个 map 、flatMap 、filter 调用的时候。
for {
a <- Set(1)
b <- Option(41)
} yield (a + b)
// : Set[Int] = Set(42)
参考链接:https://blog.csdn.net/weixin_44441131?spm=1000.2115.3001.5343