我有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作为参数。什么是可能的解决方案??
答案 0 :(得分:3)
你可以这样做:
val b = a.map(_.map(getValue(_)))
这会给你一个Seq[Future[Seq[Future[MyType]]]]
。那太难看了。有三种工具可以做得更好。
Future.sequence
需要Seq[Future[A]]
并为您提供Future[Seq[A]]
。输出未来将在给出结果之前等待所有输入期货完成。这可能并不总是你想要的。fut.flatMap
使用计算Future
的函数作为结果,但不会返回嵌套的Future,就像.map
一样。.flatten
上致电Seq[Seq[A]]
获取Seq[A]
把这些放在一起,你可以做类似的事情:
val b: Seq[Future[Seq[MyType]] = a.map(_.flatMap(x => Future.sequence(getValue(x))))
val c: Future[Seq[MyType]] = Future.sequence(b).map(_.flatten)
更一般地说,在处理“容器”类型时,您将使用map
和flatMap
的某种组合来获取内部类型并传递它们。普通容器通常有办法压扁或交换订单,例如A[A[X]] => A[X]
或A[B[X]] => B[A[X]]
。