Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala定义了两个选项,第一个返回,第二个返回_Scala - Fatal编程技术网

scala定义了两个选项,第一个返回,第二个返回

scala定义了两个选项,第一个返回,第二个返回,scala,Scala,如果我有optionA和optionB,如果两者都已定义且optionB均未定义,我如何返回optionA 基本上,我正试图重写这个 val result: Option[Long] = if(optionA.isDefined && optionB.isDefined) optionA else optionB 不,optionA.orElse(optionB)不一样,它破坏了我们的测试用例。这两个选项都必须定义,我们希望使用optionA。如果

如果我有optionA和optionB,如果两者都已定义且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很有趣,但我认为它仍然令人困惑,尽管它比我的好。当然是最好的解决方案!很不错的。