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)
| 归档时间: |
|
| 查看次数: |
12381 次 |
| 最近记录: |