2014-11-03 14 views
24

Tôi muốn đi val này:Làm thế nào để san bằng một Danh sách Futures ở Scala

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

Thực hiện một số hoạt động trên đó (tôi đã suy nghĩ flatten)

f.flatten 

Và có được kết quả này

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

Nếu phương pháp flatten không phù hợp ở đây, điều đó là tốt. Miễn là tôi nhận được kết quả.

Cảm ơn!

+0

Bạn muốn điều gì xảy ra nếu một trong các 'Tương lai không thành công? –

+0

Nếu bất kỳ tương lai nào thất bại, thì tôi muốn toàn bộ mọi thứ thất bại. Đây là một phần của một câu hỏi về bài tập về nhà, vì vậy tôi đã không tìm cách để có được toàn bộ điều giải quyết cho tôi. Nhưng về cơ bản, tôi vẫn phải tìm ra cách để xác định xem có bất kỳ tương lai nào thất bại và nếu họ làm thế, tôi chỉ giết toàn bộ điều đó. – mikejones1477

Trả lời

49

Future.sequence mất List[Future[T]] và trả về một Future[List[T]].

Bạn có thể làm

Future.sequence(f) 

và sau đó sử dụng map hoặc onComplete vào nó để truy cập vào danh sách các giá trị.

+0

Đây là kết quả tôi nhận được: scala.concurrent.Future [List [Int]] = [email protected] Đây có phải là dự kiến ​​không? Nó đang chuyển đổi một List [Future [T]] thành một tương lai [List [T]]. Nhưng tôi đã mong đợi điều gì đó dọc theo các dòng: scala.concurrent.Future [Danh sách [Int]] = Tương lai (Danh sách (1,2,3)) Cảm ơn! – mikejones1477

+0

Vâng, đó là một 'Tương lai'. Bây giờ bạn có thể xử lý nó (hoặc bản đồ, sử dụng onComplete hoặc bất cứ điều gì bạn muốn). Kết quả bên trong 'Tương lai' sẽ là danh sách của bạn trong trường hợp thành công –

+1

' Tương lai' thường không in nội dung bên trong (có nghĩa là chặn). Nếu bạn làm 'Tương lai (1)', bạn sẽ nhận được một cái gì đó trông giống như 'scala.concurrent.impl.Promise $ DefaultPromise @ 78393fdb'. Để thử nghiệm, bạn có thể sử dụng một cái gì đó như 'Await.result (f, 2.seconds)'. – lmm

Các vấn đề liên quan