如何基于Future [Boolean]而不是Boolean创建Enumeratee过滤器

时间:2015-01-27 07:17:05

标签: scala playframework playframework-2.3

在我的Play应用程序中,我使用过滤功能创建了一个Enumeratee:

val activeTeams = Enumeratee.filter[Team](teamIsActive)

我的问题是我的teamIsActive函数返回Team => Future[Boolean]Enumeratee.filter方法将Team => Boolean作为参数:

def teamIsActive: (Team) => Future[Boolean] = {
team: Team =>
  val teamSize = Future[Int] = teamRepository.membersOf(team).map {
    members => members.size
  }

  teamSize.map(_ > 0)
}

那么,我如何将Future[Boolean]Enumeratee

一起使用

1 个答案:

答案 0 :(得分:1)

我认为这是不可能的。您无法解决谓词函数中的未来。相反,您应首先获取团队规模,然后使用团队规模列表创建谓词函数。

val teamSizes: Future[Map[Team, Int]] = teamRepository.sizes()
def teamIsActive(sizes: Map[Team, Int]): (Team) => Boolean = { team: Team =>
  sizes.getOrElse(team, 0) > 0
}

teamSizes.map { sizes =>
  val activeTeams = Enumeratee.filter[Team](teamIsActive(sizes))
}

这也减少了对存储库的查询数量。另一方面,它可以增加从存储库中提取的数据的数量。但我不知道你的数据结构。