首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果前面的函数满足了某些条件,如何使用for-comprehension并跳过运行函数?

如果前面的函数满足了某些条件,如何使用for-comprehension并跳过运行函数?
EN

Stack Overflow用户
提问于 2019-02-28 18:00:21
回答 1查看 35关注 0票数 0

我在我的mongo dao中创建了3个复制检查,以检查我的数据库中的3个不同的复制情况。(我知道最好的方法是为它们创建一个复合索引,但不幸的是现在不可能,我需要这些检查)

所以我想这样做,创建这个方法:

代码语言:javascript
复制
  def checkPersonDuplication(person: Person): Future[(ValidationResult, Option[Person])] = for {
    sameSocIdIAndCountryVerification <- {
      logger.info("sameSocIdIAndCountryVerification is running")
      findPersonSameSocIdIAndCountry(person.socId, person.country)
    }
    sameNameAndCountryVerification <- {
      logger.info("sameNameAndCountryVerification is running")
      findPersonSameNameAndCountry(person.name, person.country)
    }
    sameLastNameAndCountryVerification <- {
      logger.info("sameLastNameAndCountryVerification is running")
      findPersonSameByNameAndCountry(person.lname, person.country)
    }
  } yield (sameSocIdIAndCountryVerification, sameNameAndCountryVerification, sameLastNameAndCountryVerification) match {
    case a if a._1.isDefined => (SameSocialSecurityNumberAndCountry, sameSocIdIAndCountryVerification)
    case b if b._2.isDefined => (SameNameAndCountry, sameNameAndCountryVerification)
    case c if c._3.isDefined => (SameLastNameAndCountry, sameLastNameAndCountryVerification)
    case _ => (ValidationSuccess, None)
  }

现在,在创建方法中,我可以这样做:

代码语言:javascript
复制
 checkPersonDuplication(person) map {res => 
      res._1 match {
        case ValidationSuccess => // do something
        case SameSocialSecurityNumberAndCountry => throw DuplicateInsertion(s"???")
        case SameNameAndCountry => throw DuplicateInsertion(s"???")
        case SameLastNameAndCountry => throw DuplicateInsertion(s"???")
        }
  }

我的问题是,如果定义了sameSocIdIAndCountryVerification (因为findPersonSameSocIdIAndCountry返回OptionPerson),我就不想运行for- checks中的其他检查。

所以我试着在每个后面加上"if“,但是它抛出了NoSuchElementException。实现这一目标的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 20:48:46

这个版本避免了不必要的验证,但它并不是特别漂亮:

代码语言:javascript
复制
def checkPersonDuplication(person: Person): Future[(ValidationResult, Option[Person])] = {
  logger.info("sameSocIdIAndCountryVerification is running")
  findPersonSameSocIdIAndCountry(person.socId, person.country).flatMap {
    case x@Some(_) =>
      Future.successful((SameSocialSecurityNumberAndCountry, x))
    case None =>
      logger.info("sameNameAndCountryVerification is running")
      findPersonSameNameAndCountry(person.name, person.country).flatMap {
        case x@Some(_) =>
          Future.successful((SameNameAndCountry, x))
        case None =>
          logger.info("sameLastNameAndCountryVerification is running")
          findPersonSameByNameAndCountry(person.lname, person.country).map {
            case x@Some(_) =>
              (SameLastNameAndCountry, x)
            case None =>
              (ValidationSuccess, None)
          }
      }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54922918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档