2016-05-17 26 views
6

Tôi đang cố gắng kết nối các cuộc gọi/kết quả của các phương thức với cuộc gọi tiếp theo. Tôi nhận được phương pháp biên dịch lỗi thời gianE bởi vì nếu không thể nhận được tham chiếu của objB từ cuộc gọi trước đó.CompletableKết quả chuỗi kết quả

Làm cách nào để chuyển kết quả của cuộc gọi trước đó đến chuỗi tiếp theo? Tôi đã hoàn toàn hiểu lầm quá trình chưa?

Object objC = CompletableFuture.supplyAsync(() -> service.methodA(obj, width, height)) 
    .thenApply(objA -> { 
    try { 
     return service.methodB(objA); 
    } catch (Exception e) { 
     throw new CompletionException(e); 
    } 
}) 
    .thenApply(objA -> service.methodC(objA)) 
    .thenApply(objA -> { 
    try { 
     return service.methodD(objA); // this returns new objB how do I get it and pass to next chaining call 
     } catch (Exception e) { 
      throw new CompletionException(e); 
     } 
    }) 
    .thenApply((objA, objB) -> { 
     return service.methodE(objA, objB); // compilation error 
    }) 
.get(); 
+1

Bạn có thể phải đầu tiên của bạn 'thenApply' trả về một tuple giữ cả objA và kết quả của methodB. Hoặc, vì bạn đang sử dụng 'thenApply' chứ không phải' thenApplyAsync', kết hợp các cuộc gọi 'sau đóApply' liên tiếp thành một lambda có chức năng tương đương và cung cấp cho bạn tính linh hoạt mà bạn mong muốn –

+0

BTW, vì bạn đang sử dụng' CompletableFuture' (hoặc 'CompletionStage'), Tôi sẽ thay thế 'get()' bằng cách hoàn thành (ví dụ: thông qua 'whenComplete (...)' hoặc 'handle (...)') sẽ thực hiện bước cuối cùng, ví dụ, lên lịch tương lai cho Trình thực thi giao diện người dùng hoặc tạo và trả về một DTO trong một dịch vụ web (hoặc thành công hoặc ngoại lệ, báo cáo lỗi). Tránh chặn thường là "đầu tư" tốt nhất so với bất kỳ thứ gì khác của tương lai Java phải cung cấp (mặc dù mọi thứ khác cũng hữu ích). – acelent

Trả lời

6

Bạn có thể lưu trữ trung gian CompletableFuture trong một biến và sau đó sử dụng thenCombine:

CompletableFuture<ClassA> futureA = CompletableFuture.supplyAsync(...) 
    .thenApply(...) 
    .thenApply(...); 

CompletableFuture<ClassB> futureB = futureA.thenApply(...); 

CompletableFuture<ClassC> futureC = futureA.thenCombine(futureB, service::methodE); 

objC = futureC.join(); 
Các vấn đề liên quan