Для понимания с Future [String] и Future [List [String]] - PullRequest
1 голос
/ 08 июля 2019

Упрощенный код:

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 Ответ

6 голосов
/ 08 июля 2019

Попробуйте

  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))
  }

В качестве альтернативы мы могли бы использовать скаляр 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)
  }
...