【问题标题】:For comprehension with Future[String] and Future[List[String]]对于 Future[String] 和 Future[List[String]] 的理解
【发布时间】:2019-07-09 02:16:14
【问题描述】:

简化代码:

val one: Future[String] = Future("1")
val many: Future[List[String]] = Future({"1","2","3"})

for { 
  a <- one
  b <- many
} yield {
  doSomething(a,b) // Type mismatch, expected String, actual: List[String]
}

我想要发生的是调用一对一对/多并获取输出列表

 {doSomething("1","1"),doSomething("1","2"),doSomething("1","3")}

即使一个是Future[String] 而另一个是Future[List[String]],我也可以让它用于理解吗?

【问题讨论】:

  • {"1","2","3"} 语法无效,但我明白你的意思。您想要Future[List[X]] 作为结果还是List[Future[X]]
  • 那么你需要等待期货......这在某种意义上违背了拥有它们的目的。

标签: scala for-comprehension


【解决方案1】:

试试

  val one: Future[String] = Future("1")
  val many: Future[List[String]] = Future(List("1","2","3"))

  def doSomething(a: String, b: String) = ???

  for {
    a <- one
    b <- many
  } yield {
    b.map(v => doSomething(a, v))
  }

或者,我们可以像这样使用 scalaz ListT 转换器

  import scalaz._
  import ListT._
  import scalaz.std.scalaFuture.futureInstance

  val one: Future[String] = Future("1")
  val many: Future[List[String]] = Future(List("1","2","3"))

  def doSomething(a: String, b: String) = ???

  for {
    a <- listT(one.map(v => List(v)))
    b <- listT(many)
  } yield {
    doSomething(a, b)
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多