Использование для понимания в Scala только flatMap Future [T] после теста If - PullRequest
0 голосов
/ 19 октября 2018

Мне нужна помощь в использовании оператора if, который должен выполняться только в том случае, если тест ложен для понимания будущего.Я новичок в scala и использую это сообщение в блоге в качестве руководства.

Код

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

Если emptyResults истинно, то выбрасывает getResp()ошибка, но в приведенном выше примере getResp() запускается, даже если emptyResults имеет значение true.Как мне убедиться, что getResp() запускается, только если emptyResults ложно?

Я также попытался написать оператор if, как показано ниже, но это выдает ошибку error: value map is not a member of Any

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

Я рассмотрел другие решения, в том числе , и , и , , но они не помогли с этой проблемой.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы можете позвонить areResultsEmpty охраннику в выражении понимания.

for {
  resp <- getResp(content) if !areResultsEmpty(content)
} yield resp
0 голосов
/ 19 октября 2018

A for понимание - "синтаксический сахар".Это означает, что перед переводом в байтовый код он сначала переводится в другую стандартную языковую конструкцию.

В этом случае у вас есть генератор <- и защита if ....Это будет переведено на map() вызов и withFilter() вызов.Итак, вы видите, вы не можете предотвратить запуск генератора, добавив условие защиты.Охранник может действовать только как фильтр для того, что передается в yield.

. Чтобы получить то, что вы хотите, вам нужно переместить тест состояния за пределы понимания for, и в этот моментпроще просто сделать это map().

val result = if (areResultsEmpty(content)) {
                . . . //some default
             } else {
                getResp(content).map(/*do work*/)
             }
0 голосов
/ 19 октября 2018

Вы не можете назначить перед любыми генераторами в для понимания.

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

Вместо этого попробуйте что-то вроде:

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