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

How to create an Enumeratee filter based on a Future[Boolean] instead of a Boolean

在我的 Play 应用程序中,我正在使用过滤器函数创建一个 Enumeratee:

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

我的问题是我的 teamIsActive 函数 returns 一个 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

一起使用

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

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))
}

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