在If测试之后,在Scala中将For Comprehension用于仅flatMap Future [T]

时间:2018-10-19 15:26:35

标签: scala future for-comprehension

我需要使用if语句来获得帮助,该if语句仅在对期货的理解中测试为假时才运行。我是scala的新手,并以this blog post作为指导。

代码是

  for {
      emptyResults: Boolean = areResultsEmpty(content)
      resp <- getResp(content) if !emptyResults
      } yield resp

如果emptyResults为true,则getResp()会引发错误,但是在以上情况下,即使getResp()为true,emptyResults也会运行。我如何确保getResp()仅在emptyResults为假的情况下运行?

我还尝试过编写如下的if语句,但是会引发错误error: value map is not a member of Any

  acmResp <- if (!emptyResults) {
    getResp(content)
  }

我在这里查看了其他解决方案,包括thisthisthis,但是它们对解决这个问题没有帮助。

3 个答案:

答案 0 :(得分:3)

for的理解是“语法糖”。这意味着,在将其翻译成字节码之前,先将其翻译成另一种标准语言构造。

在这种情况下,您有一个生成器<-和一个守护程序if ...。它将转换为一个map()调用和一个withFilter()调用。因此,您看到了,您无法通过添加保护条件来阻止生成器执行。守卫只能充当对传递到yield的内容的过滤器。

要获得所需的内容,您必须将条件测试移至for理解之外,此时,将其简化为简单的map()即可。

val result = if (areResultsEmpty(content)) {
                . . . //some default
             } else {
                getResp(content).map(/*do work*/)
             }

答案 1 :(得分:0)

您不能在a中的任何生成器之前进行分配。

for {
  emptyResults: Boolean = areResultsEmpty(content) // Not allowed
  resp <- getResp(content) if !emptyResults
} yield resp

相反,请尝试以下操作:

if(!areResultsEmpty(content)) {
  for {
      resp <- getResp(content)
  } yield resp
}
else {
  ...
}

答案 2 :(得分:0)

您可以在理解表达式中调用areResultsEmpty的后卫。

for {
  resp <- getResp(content) if !areResultsEmpty(content)
} yield resp