Scala了解如何在传递结果时避免创建Future

时间:2017-08-07 09:42:36

标签: scala for-comprehension

我使用Playframework和Slick异步功能,但不确定如何使用Future返回方法将结果内联到一个用于理解。现在我这样做:

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  for {
    translations <- translationRepo.findByIds(ids)
    translations2 <- Future(sortByHowManyChecks(checkedWordsIds, translations))
    wordDefinitionsList <- Future(translations2.map(translation => WordDefinition(translation._2.english, translation._2.translation)))
  } yield {
    wordDefinitionsList
  }
}

我想知道如何摆脱translate2&lt; - Future(),除了将其移动到函数(或将函数包装到另一个返回Future的函数)。 sortByHowManyChecks函数返回第三方库中的Map [Long,TranslationObject]。

2 个答案:

答案 0 :(得分:0)

在你的情况下,你可以这样写:

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  for {
    translations <- translationRepo.findByIds(ids)
    translations2 = sortByHowManyChecks(checkedWordsIds, translations)
  } yield translations2.map(translation => WordDefinition(translation._2.english, translation._2.translation))
}

答案 1 :(得分:0)

您如何看待不使用产量?不确定我是否得到了正确的退货声明。

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  translationRepo.findByIds(ids)
    .map(translations => sortByHowManyChecks(checkedWordsIds, translations))
    .map(translation => WordDefinition(translation._2.english, translation._2.translation))
}