亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 CompletableFuture 構建具有多種方法的對象

使用 CompletableFuture 構建具有多種方法的對象

ibeautiful 2023-05-10 14:09:41
我正在嘗試了解CompletableFuture以及如何利用它來構建一個包含從多個端點獲得的信息的對象。我遇到過幾個例子,但沒有一個是完全適合我的問題的。例如,這個并行運行相同的方法來獲取字符串列表,我想在其中并行運行多個方法來構建和返回一個對象。我為員工創建了一個簡單的 DTO:@Builder@Data@AllArgsConstructorpublic class EmployeeDTO {    private String name;    private String accountNumber;    private int salary;}我創建了一個服務來模擬調用三個獨立的 API 來設置 DTO 的值,等待時間相當長:public class EmployeeService {    public EmployeeDTO setName() {        try {            Thread.sleep(10 * 1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return EmployeeDTO.builder().name("John Doe").build();    }    public EmployeeDTO setAccountNumber() {        try {            Thread.sleep(10 * 1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return EmployeeDTO.builder().accountNumber("1235").build();    }    public EmployeeDTO setSalary() {        try {            Thread.sleep(10 * 1000);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        return EmployeeDTO.builder().salary(100000).build();    }}我可以使用supplyAsync所有三種方法然后運行,allOf但它什么也沒做:    private void run() {        EmployeeService employeeService = new EmployeeService();        CompletableFuture<EmployeeDTO> employeeCfWithName = CompletableFuture                .supplyAsync(employeeService::setName);        CompletableFuture<EmployeeDTO> employeeCfWithAccountNumber = CompletableFuture                .supplyAsync(employeeService::setAccountNumber);        CompletableFuture<EmployeeDTO> employeeCfWithSalary = CompletableFuture                .supplyAsync(employeeService::setSalary);        CompletableFuture allCompletableFutures = CompletableFuture.allOf(employeeCfWithName, employeeCfWithAccountNumber, employeeCfWithSalary);    }如何將結果組合成一個 EmployeeDTO?
查看完整描述

2 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

您必須將三個CompletableFutures 的結果合并為一個EmployeeDTO. 這不是魔術般地完成的allOf。


嘗試這樣的事情(未經測試):


CompletableFuture allCompletableFutures = CompletableFuture.allOf(

  employeeCfWithName, employeeCfWithAccountNumber, employeeCfWithSalary);


// Wait for all three to complete.

allCompletableFutures.get();


// Now join all three and combine the results.

EmployeeDTO finalResult = EmployeeDTO.builder()

  .name(new employeeCfWithName.join())

  .accountNumber(new employeeCfWithAccountNumber.join())

  .salary(new employeeCfWithSalary.join())

  .build();

這看起來有點傻。我們在每種方法中都使用一個構建器,只是為了使用第四個構建器組合它們的結果。


查看完整回答
反對 回復 2023-05-10
?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

讓您的員工服務函數將EmployeeDTO.builder()作為輸入,然后在 run() 函數中創建一個構建器,并在所有 supplyAsync 調用中將該構建器傳遞給服務。還要確保在調用 allOf() 之后調用 build() ,這保證了每個服務調用都完成了它的一部分。也不要內置單獨的服務功能 -


public class EmployeeService {


    public EmployeeDTO setName(EmployeeDTO.EmployeeDTOBuilder builder) {

        try {

            Thread.sleep(10 * 1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return builder.name("John Doe");

    }


    public EmployeeDTO setAccountNumber(EmployeeDTO.EmployeeDTOBuilder builder) {

        try {

            Thread.sleep(10 * 1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return builder.accountNumber("1235");

    }


    public EmployeeDTO setSalary(EmployeeDTO.EmployeeDTOBuilder builder) {

        try {

            Thread.sleep(10 * 1000);

        } catch (InterruptedException e) {

            throw new RuntimeException(e);

        }

        return builder.salary(100000);

    }

}

private void run() {

        EmployeeService employeeService = new EmployeeService();


        EmployeeDTO.EmployeeDTOBuilder builder = EmployeeDTO.builder();


        CompletableFuture<EmployeeDTO> employeeCfWithName = CompletableFuture

                .supplyAsync(()-> emoplyeeService.setName(builder));

        CompletableFuture<EmployeeDTO> employeeCfWithAccountNumber = CompletableFuture

                .supplyAsync(()-> emoplyeeService.setAccount(builder));

        CompletableFuture<EmployeeDTO> employeeCfWithSalary = CompletableFuture

                .supplyAsync(()-> emoplyeeService.setSalary(builder));


        CompletableFuture allCompletableFutures = CompletableFuture.allOf(employeeCfWithName, employeeCfWithAccountNumber, employeeCfWithSalary);


        builder.build();

    }


查看完整回答
反對 回復 2023-05-10
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號