gpt4 book ai didi

Scala:具有两个或多个选项的映射

转载 作者:行者123 更新时间:2023-12-03 23:15:16 24 4
gpt4 key购买 nike

基本上,我正在寻找最类似于 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:

感谢 的另一种选择兰黛 :
def sum(values: Option[Int]*): Option[Int] = 
values collect { case Some(n) => n } reduceLeftOption { _ + _ }

最佳答案

怎么样:

scala> def sum(values: Option[Int]*): Option[Int] = values.flatten match {
| case Nil => None
| case l => Some(l.sum)
| }
sum: (values: Option[Int]*)Option[Int]

scala> sum(Some(1), None)
res0: Option[Int] = Some(1)

scala> sum(Some(1), Some(4))
res1: Option[Int] = Some(5)

scala> sum(Some(1), Some(4), Some(-5))
res3: Option[Int] = Some(0)

scala> sum(None, None)
res4: Option[Int] = None

编辑

如果所有参数都是 None ,那么返回 0 可能是明智的。在这种情况下,函数将减少到 values.flatten.sum .

关于Scala:具有两个或多个选项的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com