2016-03-05 24 views
20

Java 8 có chức năng CompletableFuture.allOf(CompletableFuture<?>...cfs) trả về một CompletableFuture được hoàn thành khi tất cả các tương lai đã cho hoàn tất.Java 8 CompletableFuture.allOf (...) với Bộ sưu tập hoặc Danh sách

Tuy nhiên, tôi hầu như không làm việc với một mảng CompletableFuture giây, mà thay vào đó là List<CompletableFuture>. Tất nhiên, tôi có thể sử dụng phương pháp toArray(), nhưng điều này kết thúc là một chút đau đớn phải liên tục chuyển đổi qua lại giữa các mảng và danh sách.

Sẽ thật tuyệt nếu có một cách khéo léo có được CompletableFuture<List<T>> để đổi lấy số List<CompletableFuture<T>>, thay vì phải liên tục tạo ra một mảng trung gian. Có ai biết một cách để làm điều này trong Java 8?

Trả lời

12

Thật không may, kiến ​​thức của tôi về tương lai hoàn toàn không hỗ trợ các bộ sưu tập.

Bạn có thể làm một cái gì đó như thế này để làm cho đoạn code một chút bụi, nhưng về cơ bản làm điều tương tự:

public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList) { 
    CompletableFuture<Void> allFuturesResult = 
    CompletableFuture.allOf(futuresList.toArray()); 
    return allFuturesResult.thenApply(v -> 
      futuresList.stream(). 
        map(future -> future.join()). 
        collect(Collectors.<T>toList()) 
    ); 
} 

Các mặt hàng này rất nhiều thông tin: http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

+3

Sử dụng 'CompletableFuture.allOf (futuresList. toArray (new CompletableFuture [futuresList.size()])) 'kể từ khi CompletableFuture.allOf() nhận một mảng' CompletableFuture'. – wz366

+1

@ wz366 công trình này nhưng tôi nhận được một cảnh báo từ IntelliJ về 'new CompletableFuture [futuresList.size()]' nói 'Mảng của kiểu Object []' dự kiến – Kousha

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