scala Option类型详解
# scala Option 类型详解
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"))
2
3
4
在 模式匹配 中也可以使用 Option 类型
val nameMaybe:Option[String] = Some("tom")
nameMaybe match {
case Some(_) => println("yes")
case None => println("No name")
}
2
3
4
5
# 3. 创建 Option
通常,你可以直接实例化some样例类来创建一个Option。
val greeting:Option[String]Some("Hello world")
或者,在知道值缺失的情况下,直接使用None对象:
val greeting:Option[String]None
然而,在实际工作中,你不可避免的要去操作一些Java库,或者是其他将nu11作为缺失值的JVM语言的代码。为此,Option 伴生对象提供了一个工厂方法,可以根据给定的参数创建相应的Option:
val absentGreeting:Option[String]Option(null)//absentGreeting will be None
val presentGreeting:Option[String]Option("Hello!")//presentGreeting will be Some("Hello!")
2
# 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
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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"
2
# 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")
}
2
3
4
5
# 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)
2
3
4
5
- 01
- idea 热部署插件 JRebel 安装及破解,不生效问题解决04-10
- 02
- spark中代码的执行位置(Driver or Executer)12-12
- 03
- 大数据技术之 SparkStreaming12-12