我是来自Java背景的Scala的新手,目前对最佳实践的考虑感到困惑Option[T]
。
我觉得使用Option.map
功能更实用,更美观,但这并不是说服他人的好理由。有时,isEmpty检查感觉更直接,因此更具可读性。有任何客观优势,还是仅仅是个人喜好?
例子:
变体1:
someOption.map{ value =>
{
//some lines of code
}
} orElse(foo)
变体2:
if(someOption.isEmpty){
foo
} else{
val value = someOption.get
//some lines of code
}
我故意排除了使用fold
或模式匹配的选项。我Option
对现在将其视为集合的想法不满意,并且使用模式匹配进行简单isEmpty
检查会滥用模式匹配恕我直言。但是,无论我为什么不喜欢这些选项,我都希望将这个问题的范围限制为标题中命名的上述两个变体。
使用模式匹配进行简单的isEmpty检查会滥用模式匹配恕我直言
如果您只想isEmpty
检查,isEmpty
/isDefined
就很好了。但是在您的情况下,您也想获得价值。为此,使用模式匹配不是滥用。这正是基本用例。使用get
可以非常容易地产生错误,例如忘记检查isDefined
或进行错误的检查:
if(someOption.isEmpty){
val value = someOption.get
//some lines of code
} else{
//some other lines
}
希望测试能够抓住它,但是没有理由满足“希望”。
出于相同的原因,组合器(map
和朋友)也比get
模式匹配更好,因为模式匹配是:它们不允许您犯这种错误。在模式匹配和组合器之间进行选择是一个不同的问题。通常,首选组合器,因为它们更容易组合(如Yuval的答案所解释)。如果您想做一个单独的组合器,我通常会选择它们;如果您需要组合(如map ... getOrElse
)或fold
带有多行分支的组合,则取决于具体情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句