基本上,我正在寻找最类似于 scala 的方式来执行以下操作:
def sum(value1: Option[Int], value2: Option[Int]): Option[Int] =
if(value1.isDefined && value2.isDefined) Some(value1.get + value2.get)
else if(value1.isDefined && value2.isEmpty) value1
else if(value1.isEmpty && value2.isDefined) value2
else None
这给出了正确的输出:
sum(Some(5), Some(3)) // result = Some(8)
sum(Some(5), None) // result = Some(5)
sum(None, Some(3)) // result = Some(3)
sum(None, None) // result = None
然而,要总结两个以上的选项,我必须使用太多if
的 s 或使用某种循环。
编辑-1:
在写这个问题时,我想出了一个答案:
def sum2(value1: Option[Int], value2: Option[Int]): Option[Int] =
value1.toList ::: value2.toList reduceLeftOption { _ + _ }
对于我没有经验的人来说,这看起来非常地道。这甚至可以使用两个以上的值。然而,是否可以在不转换为列表的情况下做同样的事情?
编辑-2:
我最终得到了这个解决方案(感谢ziggystar):
def sum(values: Option[Int]*): Option[Int] =
values.flatten reduceLeftOption { _ + _ }
编辑-3:
感谢Landei的另一种选择:
def sum(values: Option[Int]*): Option[Int] =
values collect { case Some(n) => n } reduceLeftOption { _ + _ }