2014-11-03 20 views
24

chcę wziąć ten Val:Jak spłaszczyć listę Futures w Scala

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

wykonać jakąś operację na niej (myślałem spłaszczyć)

f.flatten 

I uzyskać ten wynik

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

Jeśli metoda Spłaszczenie nie jest właściwe tutaj, że jest w porządku. Dopóki osiągam wynik.

Dzięki!

+0

Co chcesz zrobić, jeśli jedna z 'Przyszłości' się nie powiedzie? –

+0

Jeśli któraś z przyszłych kontraktów zawiedzie, to chcę, żeby wszystko się nie udało. Jest to część zadania domowego, więc nie chciałem rozwiązać sprawy. Ale w zasadzie wciąż muszę wymyślić, jak ustalić, czy któraś z przyszłości zakończyła się fiaskiem, a jeśli tak, to po prostu zabiję całą sprawę. – mikejones1477

Odpowiedz

49

Future.sequence pobiera List[Future[T]] i zwraca wartość Future[List[T]].

Można zrobić

Future.sequence(f) 

a następnie użyć map lub onComplete na to, aby uzyskać dostęp do listy wartości.

+0

To jest dane wyjściowe, które otrzymuję: scala.concurrent.Future [List [Int]] = [email protected] Czy to jest oczekiwane? Przekształca List [Przyszłość [T]] w Przyszłość [Lista [T]]. Ale spodziewałem się czegoś w rodzaju: scala.concurrent.Future [List [Int]] = Future (List (1,2,3)) dzięki! – mikejones1477

+0

Tak, to "Przyszłość". Teraz możesz sobie z tym poradzić (albo mapę, użyj opcji onComplete lub cokolwiek chcesz). Rezultatem wewnątrz 'Future' będzie twoja lista w przypadku sukcesu. –

+1

' Future' zwykle nie drukuje tego, co jest w środku (co oznaczałoby blokowanie). Jeśli wykonasz 'Future (1)', otrzymasz coś, co wygląda jak 'scala.concurrent.impl.Promise $ DefaultPromise @ 78393fdb'. Do testowania możesz użyć czegoś takiego jak 'Await.result (f, 2.seconds)'. – lmm