Scala Future [myType]到MyType

时间:2017-06-15 20:24:16

标签: scala future

我有Future [MyType],我需要将MyType的值传递给返回Seq [Future [MyType]]的方法,因此问题的基本签名是:

val a: Seq[Future[MyType]] = ...

getValue(t: MyType): Seq[Future[MyType]] = {...}

我想将a的值传递给getValue。我试过像:

val b:Seq[Future[MyType]] = a.map{v => getValue(v)}

我希望b属于Seq[Future[MyType]]类型

但是,它显然不起作用,因为v是Future [MyType]类型,getValue只需要MyType作为参数。什么是可能的解决方案??

1 个答案:

答案 0 :(得分:3)

你可以这样做:

val b = a.map(_.map(getValue(_)))

这会给你一个Seq[Future[Seq[Future[MyType]]]]。那太难看了。有三种工具可以做得更好。

  1. Future.sequence需要Seq[Future[A]]并为您提供Future[Seq[A]]。输出未来将在给出结果之前等待所有输入期货完成。这可能并不总是你想要的。
  2. fut.flatMap使用计算Future的函数作为结果,但不会返回嵌套的Future,就像.map一样。
  3. 您可以在.flatten上致电Seq[Seq[A]]获取Seq[A]
  4. 把这些放在一起,你可以做类似的事情:

    val b: Seq[Future[Seq[MyType]] = a.map(_.flatMap(x => Future.sequence(getValue(x))))
    val c: Future[Seq[MyType]] = Future.sequence(b).map(_.flatten)
    

    更一般地说,在处理“容器”类型时,您将使用mapflatMap的某种组合来获取内部类型并传递它们。普通容器通常有办法压扁或交换订单,例如A[A[X]] => A[X]A[B[X]] => B[A[X]]