在 Scala 中处理两个选项

Man*_*oid 2 scala scala-option

我有 2 个选项,我需要取它们持有的值的平均值。

有可能缺少一个或两个。如果缺少其中一个值,我只会将另一个值作为平均值。但如果两者都缺失,我会求助于一些默认值。

如何以干净的方式做到这一点?

我可以使用 isEmpty 检查值的缺失,但是这与空检查不一样吗?

J0H*_*0HN 6

我想这是不言自明的:

val option1 = Some(12.0)
val option2 = None
val default = 0.0

val average = (option1, option2) match {
   case (Some(val1), Some(val2)) => (val1 + val2) / 2
   case (None, Some(val2)) => val2
   case (Some(val1), None) => val1
   case (None, None) => default
}
Run Code Online (Sandbox Code Playgroud)

...但如果不是,基本思想是您构造一个选项元组,然后在该元组上进行模式匹配。

这有一个好处是显式捕获所有四种可能的情况 + 得到编译器的支持 - 由于Option是一个密封特性,编译器可以检查并确保覆盖了模式匹配的所有潜在分支。

  • 你只需抛出一个异常而不是默认的:) `case (None, None) => throw new Exception("your exception gets here")`。 (2认同)