Я иногда оказываюсь в ситуации, когда у меня есть несколько Stream[X]
и function X => Future Y
, которые я хотел бы объединить с Future[Stream[Y]]
, и я не могу найти способ сделать это, Например, у меня есть
val x = (1 until 10).toStream
def toFutureString(value : Integer) = Future(value toString)
val result : Future[Stream[String]] = ???
Я пробовал
val result = Future.Traverse(x, toFutureString)
который дает правильный результат, но, кажется, поглощает весь поток перед возвращением Будущего, которое более или менее поражает пупс
Я пробовал
val result = x.flatMap(toFutureString)
но не компилируется с type mismatch; found : scala.concurrent.Future[String] required: scala.collection.GenTraversableOnce[?]
val result = x.map(toFutureString)
возвращает несколько нечетный и бесполезный Stream[Future[String]]
Что мне делать, чтобы все исправлено?
Изменить: я не застрял на Stream
, я был бы в равной степени счастлив с той же операцией на Iterator
, если он не будет блокировать оценку всех элементов, прежде чем приступать к обработке головы
Edit2: я не уверен на 100%, что конструкция Future.Traverse должна пересекать весь поток, прежде чем возвращать Future [Stream], но я думаю, что это так. Если это не так, это прекрасный ответ сам по себе.
Edit3: Мне тоже не нужно, чтобы результат был в порядке, я в порядке с потоком или итератором, возвращающимся в любой порядок.