【问题标题】:Reverse of Future.sequenceFuture.sequence的逆向
【发布时间】:2017-07-13 02:05:14
【问题描述】:

我知道Future.sequence 调用可以将List[Future[T]] 转换为Future[List[T]],但如果我想反过来呢?

我想将Future[List[T]] 转换为List[Future[T]]

我想这样做的原因如下:

我向使用 Slick 3 查询数据库的参与者发送消息。 Slick 查询返回list: Future[List[T]]。如果我可以将这个list 转换为list: List[Future[T]],那么我就能做到:

list.map(convertToMessage).foreach(m => m pipeTo sender())

所以基本上我想将从数据库中提取的每条记录转换为一条消息,然后将其发送给调用参与者。

【问题讨论】:

    标签: scala


    【解决方案1】:

    我认为这是不可能的,抱歉。

    Future[List[T]] 可以完成一个空列表、一个包含一个元素的列表或任意数量的元素。

    那么,如果您将其转换为List[Future[T]],该列表将包含多少个 Future?

    【讨论】:

      【解决方案2】:

      您可以执行以下操作,而不是使用 akkas pipeTo 模式:

      // capture the sender, before the future is started - just like pipeTo does
      val s = sender()
      futureOfListOfFoo.foreach { listOfFoo =>
        listOfFoo.map(convertToMessage).foreach { foo => s ! foo }
      }
      

      【讨论】:

        【解决方案3】:

        为什么要这样做?你想达到什么目标?一旦你的未来解决了,列表中的所有项目都可用,因此通过将每个项目提升到自己的未来,你获得的收益很少。

        无论如何:

        import scala.concurrent._
        import scala.concurrent.duration._
        import scala.concurrent.ExecutionContext.Implicits.global
        
        // Assuming some starting future.
        val foo: Future[List[String]] = Future.successful(List("foo"))
        
        // This is pointless, because all we're doing is lifting each item in the list into its own already resolved future.
        val bar: Future[List[Future[String]]] = foo.map(_.map(Future.successful))
        
        // NB: you shouldn't use Await.
        val baz: List[Future[String]] = Await.result(bar, 0.nanos)
        

        【讨论】:

          猜你喜欢
          • 2015-03-20
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-26
          • 2013-01-13
          • 1970-01-01
          相关资源
          最近更新 更多