2014-11-03 3 views
24

Я хочу воспользоваться этими Вэлами:Как придавить список Futures в Scala

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

выполнять некоторые операции над ним (я думал, сглаживается)

f.flatten 

И получить этот результат

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

Если метод flatten здесь не подходит, это нормально. Пока я получаю результат.

Спасибо!

+0

Что вы хотите, если один из «Будущих» не пройдет? –

+0

Если какой-либо из фьючерсов терпит неудачу, я хочу, чтобы все это потерпело неудачу. Это часть домашнего задания, поэтому я не хотел, чтобы все это было решено для меня. Но в принципе, мне все же нужно выяснить, как определить, не сработало ли какое-либо из фьючерсов, и если бы они это сделали, я просто убил все это. – mikejones1477

ответ

49

Future.sequence принимает List[Future[T]] и возвращает Future[List[T]].

Вы можете сделать

Future.sequence(f) 

, а затем использовать map или onComplete на нее, чтобы получить доступ к списку значений.

+0

Это результат, который я получаю: scala.concurrent.Future [Список [Int]] = [email protected] Ожидается ли это? Он преобразует List [Future [T]] в будущее [List [T]]. Но я ожидал что-то вдоль линий: scala.concurrent.Future [Список [Int]] = Future (List (1,2,3)) Спасибо! – mikejones1477

+0

Да, это «Будущее». Теперь вы можете справиться с этим (либо с помощью карты, либо с помощью onComplete, либо с любого другого). Результатом внутри «Будущего» станет ваш список в случае успеха. –

+1

«Будущее» обычно не печатает то, что внутри него (это будет означать блокировку). Если вы выполняете 'Future (1)', вы получите то, что выглядит как 'scala.concurrent.impl.Promise $ DefaultPromise @ 78393fdb'. Для тестирования вы можете использовать что-то вроде 'Await.result (f, 2.seconds)'. – lmm

Смежные вопросы