Scala选项:地图与模式匹配

Pra*_*nna 13 scala

Option在Scala 处理时,我应该考虑哪些事情来决定是映射还是模式匹配?例如,如果我有Option[MyClass],我可以通过以下方式处理它:

def getList(myOptionInstance: Option[MyClass]): List[String] =
  myOptionInstance map (...) getOrElse(List.empty[String])
Run Code Online (Sandbox Code Playgroud)

要么

def getList(myOptionInstance: Option[MyClass]): List[String] = myOptionInstance match {
  case Some(mySomeInstance) => .....
  case None => List.empty[String]
}
Run Code Online (Sandbox Code Playgroud)

我何时会选择一个而不是另一个?

vpt*_*ron 28

我第二个@rar:fold是处理这个的首选方式.

有些人更喜欢模式匹配,因为它"酷"(无论它意味着什么),有时更容易阅读.

我尽量避免使用,getOrElse因为它不会强制您使用与您的包装类型相同的默认值类型Option:

def getOrElse[B >: A](default: ? B): B
Run Code Online (Sandbox Code Playgroud)

所以你可以写:

val v = Some(42).getOrElse("FortyTwo")
Run Code Online (Sandbox Code Playgroud)

这里v有类型Any.用这样一个愚蠢的例子很容易看到问题,但有时它不那么明显并且可能导致问题.

同时fold:

def fold[B](ifEmpty: ? B)(f: (A) ? B): B
Run Code Online (Sandbox Code Playgroud)

它会强制您为两个分支返回相同的类型.

scala> Some(42).fold("fortyTwo")(v => v)
<console>:8: error: type mismatch;
 found   : Int
 required: String
              Some(42).fold("fortyTwo")(v => v)
Run Code Online (Sandbox Code Playgroud)

  • 我不得不在这里不同意 - 在你有一个合法的默认值的情况下,`getOrElse(v)`比'fold(v)(identity)`更好.关于意图的清晰度胜过不必要的润滑到"任何"的可能性(无论如何,它应该在任何合理的环境中快速安全地崩溃). (5认同)

mau*_*hiz 5

模式匹配为:

  • 效率更高
  • 不是关于子类型的肛门(在这种情况下,@ rarry必须添加类型提示)
  • 更容易阅读
  • 马丁·奥德克斯(Martin Oderksy)认可:https ://stackoverflow.com/a/5332657/578101