首页 > 解决方案 > 在scala中为理解而组成

问题描述

我有一个供理解的任务列表:

def main = {
    List("en", "es", "de").foreach(c => execAll(c))
} 

def execAll(country: String): Future[Unit] = {
   for {
      _ <- repo.exec1(country)
      _ <- repo.exec2(country)
      _ <- repo.exec3(country)
      _ <- repo.exec4(country)
      _ <- repo.exec5(country)
   } yield ()
}

现在的问题是因为我需要执行功能exec4并且exec5仅适用于“en”和“es”国家。我尝试按条件将函数添加到期货列表中(if country == "en"不要添加)

val all = for {
      _ <- repo.exec1(country)
      _ <- repo.exec2(country)
      _ <- repo.exec3(country)
} yield ()

val enOrEsOnly = for {
      _ <- repo.exec4(country)
      _ <- repo.exec5(country)
} yield ()

country match {
    case "de" => all
    case other => all + enOrEsOnly // invalid code
}

可以在这里找到解决方案for-comprehension吗?或者可以在这里使用期货列表?我不需要他们的结果。谢谢

或者我可以使用 anif来解决它:

if (country != "de") {
   repo.exec4(country)
   repo.exec5(country)
}

标签: scalafuturefor-comprehension

解决方案


我宁愿在上面添加一个repo具有验证的额外层,这样您的代码将是相同的,并且在该额外层中您将执行以下操作:

final class Domain(repo: Repository) {
  def exec4(country: String): Future[Unit] =
    country match {
      case "en" | "es" => repo.exec4(country)
      case _ => Future.unit
    }
}

推荐阅读