mapowanie strumienia z funkcją zwracającą przyszłość
Czasami znajduję się w sytuacji, w której mam trochęStream[X]
i afunction X => Future Y
, które chciałbym połączyć zFuture[Stream[Y]]
i nie mogę znaleźć sposobu, aby to zrobić. Na przykład mam
val x = (1 until 10).toStream
def toFutureString(value : Integer) = Future(value toString)
val result : Future[Stream[String]] = ???
próbowałem
val result = Future.Traverse(x, toFutureString)
co daje poprawny wynik, ale wydaje się pochłaniać cały strumień przed zwróceniem Przyszłości, która mniej lub bardziej pokonuje purpse
próbowałem
val result = x.flatMap(toFutureString)
ale to się nie kompilujetype mismatch; found : scala.concurrent.Future[String] required: scala.collection.GenTraversableOnce[?]
val result = x.map(toFutureString)
zwraca nieco dziwne i bezużyteczneStream[Future[String]]
Co powinienem tutaj zrobić, aby naprawić problemy?
Edytuj: Nie utknąłem naStream
, Byłbym równie zadowolony z tej samej operacji naIterator
, o ile nie zablokuje to oceny wszystkich elementów przed rozpoczęciem przetwarzania głowy
Edit2: Nie jestem w 100% pewien, że konstrukcja Future.Traverse musi przejść przez cały strumień przed zwróceniem Future [Stream], ale myślę, że tak. Jeśli nie, to sama w sobie świetna odpowiedź.
Edit3: Nie potrzebuję też, aby wynik był w porządku, wszystko jest w porządku, jeśli strumień lub iterator zwrócony jest w dowolnej kolejności.