Scala - Как вызвать будущую функцию при отображении на Seq? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть Seq[String], и эти строковые значения необходимы для вызова другой функции, определенной как:

def getSomethingById(id: String): Future[Someting]

Я пытаюсь создать функцию, которая принимает Seq[String] и возвращает Future[Seq[Something]]; то есть.,

def getSomethings(ids: Seq[String]): Future[Seq[Something]]

Единственный способ получить тип Something - вызвать метод getSomethingById выше.

Есть ли способ, которым я могу нанести на карту Seq[String], затем позвонить getSomethingById?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

В дополнение к существующему ответу вы также можете использовать Future.traverse, который очень похож

scala> import scala.concurrent.Future
       import scala.concurrent.ExecutionContext.Implicits.global


def getSomethingById(id: String): Future[String] = Future{
  id + "from Something Id"
}

def getSomethings(ids: Seq[String]): Future[Seq[String]] = 
       Future.traverse(ids)(getSomethingById)

scala> getSomethingById: (id: String)scala.concurrent.Future[String]
scala> getSomethings: (ids: Seq[String])scala.concurrent.Future[Seq[String]]

Тест

scala> getSomethings(Range.apply(1,3).map(_.toString))
res0: Vector(1from Something Id, 2from Something Id)
0 голосов
/ 07 мая 2018

Вы можете использовать Future.sequence для этого:

def getSomethings(ids: Seq[String]): Future[Seq[Something]] =
  Future.sequence(ids.map(getSomethingById))

https://www.scala -lang.org / апи / ток / Scala / параллельный / Future% 24.html

Простая версия Future.traverse. Асинхронно и неблокирующе превращает TraversableOnce [Future [A]] в Будущее [TraversableOnce [А]]. Полезно для уменьшения многих фьючерсов в одиночное будущее.

...