2014-11-03 21 views
24

voglio prendere questo val:Come appiattire un elenco di Futures a Scala

val f = List(Future(1), Future(2), Future(3)) 

eseguire alcune operazioni su di esso (stavo pensando appiattire)

f.flatten 

E ottenere questo risultato

scala> f.flatten = List(1,2,3) 

Se il metodo di appiattimento non è appropriato qui, va bene. Finché raggiungo il risultato.

Grazie!

+0

Cosa vuoi che succeda se uno dei 'Future's fallisce? –

+0

Se uno dei futures fallisce, allora voglio che il tutto fallisca. Questo fa parte di una domanda a casa, quindi non stavo cercando di risolvere il tutto per me. Ma in fondo, devo ancora capire come determinare se qualcuno dei futures abbia fallito e se lo facessero, ucciderei il tutto. – mikejones1477

risposta

49

Future.sequence prende un List[Future[T]] e restituisce un Future[List[T]].

Si può fare

Future.sequence(f) 

e quindi utilizzare map o onComplete su di esso per accedere all'elenco dei valori.

+0

Questo è l'output che sto ottenendo: scala.concurrent.Future [List [Int]] = [email protected] È previsto? Trasforma un elenco [Futuro [T]] in un futuro [Elenco [T]]. Ma mi aspettavo qualcosa lungo le linee di: scala.concurrent.Future [List [Int]] = Futuro (Lista (1,2,3)) Grazie! – mikejones1477

+0

Sì, è un "Futuro". Ora puoi gestirlo (o mappa, usa onComplete o qualsiasi cosa tu voglia). Il risultato all'interno di 'Future' sarà la tua lista in caso di successo –

+1

' Future' normalmente non stampa cosa c'è dentro (ciò significherebbe il blocco). Se fai 'Future (1)', otterrai qualcosa che assomiglia a 'scala.concurrent.impl.Promise $ DefaultPromise @ 78393fdb'. Per i test puoi usare qualcosa come "Await.result (f, 2.seconds)". – lmm