如何实施期货构成

时间:2017-06-27 09:21:13

标签: scala

我有一个方法:

def findUserById(id: String): Future[Option[User]]

现在我想基于它制作另一种方法:

def findUserById(ids: Seq[String]): Future[Seq[User]]

但我在使用期货时遇到了一些问题。如何正确实施期货构成?

我有一个实现(未经过测试),但我认为它可以变得更容易。此外,我不确定该实现的性能:

  override def findUsersById(ids: Seq[String]): Future[Seq[User]] = {
    val futures = ids.map(id => findUserById(id))
    val filtered = Future.sequence(futures).map(_.filterNot(_.isEmpty)).map(_.map(_.get))
    filtered
  }

1 个答案:

答案 0 :(得分:5)

您可以将sequence + map替换为traverse,将filter + map替换为flatten

def findUsersById(ids: Seq[String]): Future[Seq[User]] = 
  Future.traverse(ids)(findUserById).map(_.flatten)

一般来说,Future.traverseFuture.sequence更简洁,更有效,因为它避免了创建中间Seq[Future[T]]