在Scala中处理Option
时,我应该考虑决定是映射还是模式匹配?例如,如果我有Option[MyClass]
,我可以通过以下方式处理它:
def getList(myOptionInstance: Option[MyClass]): List[String] =
myOptionInstance map (...) getOrElse(List.empty[String])
或
def getList(myOptionInstance: Option[MyClass]): List[String] = myOptionInstance match {
case Some(mySomeInstance) => .....
case None => List.empty[String]
}
我何时会选择其中一个?
答案 0 :(得分:28)
我是第二个@rar:fold
是处理此问题的首选方式。
有些人更喜欢模式匹配,因为它“酷”(无论它意味着什么),有时更容易阅读。
我尽量避免使用getOrElse
,因为它不会强制您使用与Option
中包含的类型相同的默认值类型:
def getOrElse[B >: A](default: ⇒ B): B
所以你可以写:
val v = Some(42).getOrElse("FortyTwo")
此处v
的类型为Any
。用这样一个愚蠢的例子很容易看出这个问题,但有时它并不那么明显,可能导致问题。
fold
:
def fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
它会强制您为两个分支返回相同的类型。
scala> Some(42).fold("fortyTwo")(v => v)
<console>:8: error: type mismatch;
found : Int
required: String
Some(42).fold("fortyTwo")(v => v)
答案 1 :(得分:5)
模式匹配是:
答案 2 :(得分:1)
我会这样做:
myOptionInstance.fold(Nil: List[String])(...)