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

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

使用 CompletableFuture 構(gòu)建具有多種方法的對象

使用 CompletableFuture 構(gòu)建具有多種方法的對象

ibeautiful 2023-05-10 14:09:41
我正在嘗試了解CompletableFuture以及如何利用它來構(gòu)建一個包含從多個端點(diǎn)獲得的信息的對象。我遇到過幾個例子,但沒有一個是完全適合我的問題的。例如,這個并行運(yùn)行相同的方法來獲取字符串列表,我想在其中并行運(yùn)行多個方法來構(gòu)建和返回一個對象。我為員工創(chuàng)建了一個簡單的 DTO:@Builder@Data@AllArgsConstructorpublic class EmployeeDTO {    private String name;    private String accountNumber;    private int salary;}我創(chuàng)建了一個服務(wù)來模擬調(diào)用三個獨(dú)立的 API 來設(shè)置 DTO 的值,等待時間相當(dāng)長: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所有三種方法然后運(yùn)行,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);    }如何將結(jié)果組合成一個 EmployeeDTO?
查看完整描述

2 回答

?
www說

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊

您必須將三個CompletableFutures 的結(jié)果合并為一個EmployeeDTO. 這不是魔術(shù)般地完成的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();

這看起來有點(diǎn)傻。我們在每種方法中都使用一個構(gòu)建器,只是為了使用第四個構(gòu)建器組合它們的結(jié)果。


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

TA貢獻(xiàn)1842條經(jīng)驗 獲得超22個贊

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


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();

    }


查看完整回答
反對 回復(fù) 2023-05-10
  • 2 回答
  • 0 關(guān)注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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