Scala选项:地图与模式匹配

时间:2014-02-21 01:47:30

标签: scala

在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]
}

我何时会选择其中一个?

3 个答案:

答案 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])(...)