第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

ibeautiful 2023-05-10 14:09:41
我正在嘗試了解CompletableFuture以及如何利用它來構建一個包含從多個端點獲得的信息的對象。我遇到過幾個例子,但沒有一個是完全適合我的問題的。例如,這個并行運行相同的方法來獲取字符串列表,我想在其中并行運行多個方法來構建和返回一個對象。我為員工創(chuàng)建了一個簡單的 DTO:@Builder@Data@AllArgsConstructorpublic class EmployeeDTO {    private String name;    private String accountNumber;    private int salary;}我創(chuàng)建了一個服務來模擬調用三個獨立的 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條經(jīng)驗 獲得超8個贊

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


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


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條經(jīng)驗 獲得超21個贊

讓您的員工服務函數(shù)將EmployeeDTO.builder()作為輸入,然后在 run() 函數(shù)中創(chuàng)建一個構建器,并在所有 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 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號