Для понимания с Future[String] и Future[List[String]]

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

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]]?


person DidUMeanRecursion    schedule 08.07.2019    source источник
comment
{"1","2","3"} недопустимый синтаксис, но я понимаю вашу точку зрения. Вы хотите Future[List[X]] в результате или List[Future[X]]?   -  person Luis Miguel Mejía Suárez    schedule 08.07.2019
comment
Тогда вам нужно будет дождаться фьючерсов... что в некотором смысле лишает их смысла.   -  person Luis Miguel Mejía Suárez    schedule 08.07.2019


Ответы (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)
  }
person Mario Galic    schedule 08.07.2019