【问题标题】:Scala Future[myType] to MyTypeScala Future[myType] 到 MyType
【发布时间】:2017-06-16 05:56:47
【问题描述】:

我有 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 作为参数。有什么可能的解决方案?

【问题讨论】:

  • 你有Seq[Future[MyType]],这意味着你有多个Future[MyType]。你拉出哪一个传递给getValue()有关系吗?序列中的第一个?第一个用Success完成?
  • jwvh,我需要通过所有的 Success

标签: scala future


【解决方案1】:

你可以这样做:

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. 您可以在Seq[Seq[A]] 上致电.flatten 以获取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)

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

【讨论】:

  • 非常感谢 Joe K,我明白你的所作所为,但有什么方法可以将 c: Future[Seq[MyType]] 转换为 c: Seq[Future[MyType]]??
  • 可能不会。可以这样想:Future[Seq[MyType]] 最终可以用一个空的 Seq 或一个包含 100 个元素的 Seq 来完成。因此,如果您将其转换为Seq[Future[MyType]],那么.size 在该对象上的结果应该是什么?当然,您可以在回答之前等待未来完成,但那为什么不这样做,只是得到一个简单的Seq[MyType]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2021-08-05
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多