A volte mi trovo in una situazione in cui ho un Stream[X]
e un function X => Future Y
, che mi piacerebbe combinare a un Future[Stream[Y]]
, e non riesco a trovare un modo per farlo. Ad esempio, homappare un flusso con una funzione che restituisce un futuro
val x = (1 until 10).toStream
def toFutureString(value : Integer) = Future(value toString)
val result : Future[Stream[String]] = ???
ho cercato
val result = Future.Traverse(x, toFutureString)
che dà il risultato corretto, ma sembra a consumare l'intero flusso prima di restituire il futuro, che più o meno sconfitte del campione da labo
ho provato
val result = x.flatMap(toFutureString)
ma che non viene compilato type mismatch; found : scala.concurrent.Future[String] required: scala.collection.GenTraversableOnce[?]
val result = x.map(toFutureString)
restituisce il po 'strano ed inutile Stream[Future[String]]
Cosa devo fare qui per ottenere le cose fisso?
Edit: Io non sono bloccato su un Stream
, sarei altrettanto felice con la stessa operazione su un Iterator
, fintanto che non bloccherà sulla valutazione di tutti gli elementi prima di iniziare a elaborare la testa
Edit2: Non sono sicuro al 100% che il costrutto Future.Traverse debba attraversare l'intero stream prima di restituire un Future [Stream], ma penso che lo faccia. In caso contrario, questa è una buona risposta in sé.
Edit3: Inoltre non ho bisogno che il risultato sia in ordine, sto bene con lo stream o l'iteratore restituito essendo qualsiasi ordine.
Nota che ho archiviato [un problema] (https://issues.scala-lang.org/browse/SI-7718) per dare seguito alla mia risposta di seguito. –
ah, ottimo @TravisBrown. Volevo farlo da solo, ma non sono riuscito a trovare un modo per accedere a Jira – Martijn
Un po 'poco chiaro: vuoi evitare di applicare "toFutureString" a tutti gli elementi della raccolta prima ...? Sembra che non ci dovrebbe essere molto overhead per creare semplicemente un futuro. Se gli articoli rimanenti nella "lista" sono thunk, cosa ne scatenerebbe la valutazione? Completamento del futuro precedente nell'elenco? Tutte le operazioni di sequenza/attraversamento che ho trovato in Scala sembravano essere rigide sugli elementi delle singole liste. – pdxleif