2015-12-04 13 views
6

Tại sao là CompletableFuture.allOf được khai báo là CompletableFuture<Void> và không trả về bộ sưu tập kết quả hoặc thứ gì khác? Tôi nghĩ rằng đó là ý tưởng tốt để thực hiện CompletableFuture.anyOf trả lại CompletableFuture<Object>, nhưng tôi thấy hai phương pháp này được kết nối và vì vậy tôi nhầm lẫn về những gì họ quay trở lại.Tại sao CompletableFuture.allOf được khai báo là CompletableFuture <Void>?

+2

Điều đó sẽ yêu cầu tạo trước 'Danh sách', ngay cả khi người gọi không bao giờ truy vấn nó. – Holger

Trả lời

5

anyOf phải bằng cách nào đó cho bạn biết kết quả của số CompletableFuture cụ thể đã hoàn thành được kích hoạt anyOf là gì. Điều đó không cần thiết trong trường hợp của allOf vì bạn biết tương lai nào đã hoàn thành - tất cả chúng.

allOf (giống như anyOf) không yêu cầu tất cả các loại tương lai đều có cùng loại. Vì vậy, nếu nó là để trở về một tương lai của bộ sưu tập, nó sẽ phải là một bộ sưu tập của Object mà có lẽ không phải là những gì bạn muốn anyway.

Nếu bạn thực sự muốn có allOf trả về một tương lai của bộ sưu tập, nó khá đơn giản để viết riêng của bạn:

public static CompletableFuture<List<Object>> myAllOf(CompletableFuture<?>... futures) { 
    return CompletableFuture.allOf(futures) 
      .thenApply(x -> Arrays.stream(futures) 
        .map(f -> (Object) f.join()) 
        .collect(toList()) 
      ); 
} 

Nếu bạn có một phiên bản kiểu an về vấn đề này và cần phải chuyển đổi một tập hợp các tương lai của một loại nhất định cho tương lai của bộ sưu tập cùng loại đó, hãy xem câu hỏi này cho một số ví dụ: List<Future> to Future<List> sequence

+0

Cảm ơn lời giải thích của bạn, nhưng dù sao tôi không thể hiểu tại sao 'allOf' không thể trả lại luồng của CompletableFuture hoặc kết quả hoặc smth khác ... – Everv0id

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