加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala定义了两个选项,先返回,否则返回第二个

发布时间:2020-12-16 18:26:46 所属栏目:安全 来源:网络整理
导读:如果我有optionA和optionB,如果两者都被定义并且optionB都未定义,我怎么能返回optionA. 基本上,我试图改写这个 val result: Option[Long] = if(optionA.isDefined optionB.isDefined) optionA else optionB 不,optionA.orElse(optionB)不一样,打破了我们的测
如果我有optionA和optionB,如果两者都被定义并且optionB都未定义,我怎么能返回optionA.

基本上,我试图改写这个

val result: Option[Long] = 
  if(optionA.isDefined && optionB.isDefined)
     optionA
  else
     optionB

不,optionA.orElse(optionB)不一样,打破了我们的测试用例.必须定义两个选项,我们要使用optionA.如果定义了optionA并且未定义optionB,则我们需要None.

有人将我的问题标记为重复,但事实并非如此.我遇到了麻烦,但最终偶然发现了答案….

好吧,我想我明白了,我绝对认为它不那么人性化了

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)

谢谢

解决方法

如果您熟悉标准的monadic操作,我认为表达您想要的最简洁的方法是:

optionB.flatMap(_ => optionA orElse optionB)

但非常清楚 – 而且非常快,因为它避免了任何对象的创建! – 只是在逻辑中准确地说出你想要的东西,即你已经写过的东西:

if (optionA.isDefined && optionB.isDefined) optionA else optionB

这就是你所说的(“如果两者都被定义,我想要A,否则我想要B”) – 所以只需将其作为代码写出来.

当降低清晰度和速度时,使用更高级别的方法并不总是可行的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读