scala定义了两个选项,第一个返回,第二个返回
如果我有optionA和optionB,如果两者都已定义且optionB均未定义,我如何返回optionA 基本上,我正试图重写这个scala定义了两个选项,第一个返回,第二个返回,scala,Scala,如果我有optionA和optionB,如果两者都已定义且optionB均未定义,我如何返回optionA 基本上,我正试图重写这个 val result: Option[Long] = if(optionA.isDefined && optionB.isDefined) optionA else optionB 不,optionA.orElse(optionB)不一样,它破坏了我们的测试用例。这两个选项都必须定义,我们希望使用optionA。如果
val result: Option[Long] =
if(optionA.isDefined && optionB.isDefined)
optionA
else
optionB
不,optionA.orElse(optionB)不一样,它破坏了我们的测试用例。这两个选项都必须定义,我们希望使用optionA。如果定义了optionA而没有定义optionB,则我们不需要任何选项
有人把我的问题标为重复的,但事实并非如此。我遇到了麻烦,但终于找到了答案
好的,我想我明白了,我肯定认为它不太容易被人理解
optionA.flatMap { aId =>
optionB.map(bId => bId).orElse(Some(aId))
}
为了增加清晰度。我们的真值表就是这样
optionA.isDefined optionB.isDefined resultNeeded
None None None
Some(a) None None
None Some(b) Some(b)
Some(a) Some(b) Some(a)
谢谢试试这个:
(optionA,optionB) match {
case (Some(v1) , Some(v2)) => Some(v1)
case (_ , a:Option) => a
}
您可以使用模式匹配:
(optionA, optionB) match {
case (Some(_), Some(_)) => optionA
case _ => optionB
}
您的真值表意味着您仅在定义optionB时返回一些,因此我们可以通过映射该选项开始计算。在map函数中,我们知道有a
b
。然后我们检查是否也有a
,然后返回该值,否则只需使用b
optionB.map(b => optionA.getOrElse(b))
如果你熟悉标准的一元操作,我认为表达你想要的最简洁的方式是:
optionB.flatMap(_ => optionA orElse optionB)
但是非常清楚——而且非常快,因为它避免了任何对象创建--就是用逻辑准确地说出你想要的,即你已经写了什么:
if (optionA.isDefined && optionB.isDefined) optionA else optionB
这就是您所说的(“如果两者都定义了,我想要A,否则我想要B”)——所以只需将其作为代码写出来
在降低清晰度和速度的情况下,使用更高级别的方法并不总是可行的。您的
flatMap
解决方案不符合您的要求。如果选项a.isEmpty
,则返回None
。但在这种情况下,您需要optionB
。optionB.flatMap(=>optionA)。orElse(optionB)
做您想做的。@DeanHiller:我现在不能回答,但在我看来,匹配(optionA,optionB)
最容易阅读。@gzm0是的,如果optionA为空,我们希望不返回任何内容。当optionB为None时使用optionA会导致我们的系统出现错误…在这种情况下,他们不会返回有效的optionA(另一个系统有一个我们必须避免的错误)@Marth,将答案作为答案发布,我将对其进行投票/勾选。gzm0很有趣,但我认为它仍然令人困惑,尽管它比我的好。当然是最好的解决方案!很不错的。