本文介绍了直接从对象列表的单通道映射到DTO列表的单通道的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

    public Mono<List<AdvancesDto>> findBySearchKeys(Map<String, String> paramsMap) {

        List<AdvancesDto> advDTOList= new ArrayList<>();
        return advanceRepo.findAllByKeys(
                tpNumber, vCode, arrivalNumber)
                .collectList()
                .flatMap(document -> {
                    AdvancesDto aa=document.get(0).dto();
                    advDTOList.add(aa);
                    if(document.get(1)!=null) {
                    aa = document.get(1).dto();
                    advDTOList.add(aa);
                    }
                    return Mono.just(advDTOList);
                })
                .switchIfEmpty(Mono.error(new DataException(HttpStatus.NOT_FOUND, "Record/s Not Found")))
                .doOnError(error -> new DataException(HttpStatus.BAD_REQUEST, "Problem while fetching Data", error));
    }
数据库正在返回预付款列表的单声道,我正在将其转换为高级列表DTO的单声道并返回给调用者。我的Advances.java已经有一个名为dto()的构建器方法,该方法将Advance对象直接转换为AdvancesDTO

我希望flatMap方法中的代码执行从Advances.Java到AdvancesDTO.java的直接映射,当前代码看起来不太好,可能会给出索引越界异常

推荐答案

我认为您在代码中混淆了一些东西。如果您的数据库返回的Advance提供了将其转换为AdvancesDTO的方法,请将您的代码更改为:

public Mono<List<AdvancesDto>> findBySearchKeys(Map<String, String> paramsMap) {
    return advanceRepo.findAllByKeys(
            tpNumber, vCode, arrivalNumber)
            .map(advances -> advances.dto()) //transfer Advances to AdvancesDTO
            .collectList() //Collect them in a list.
            .switchIfEmpty(Mono.error(new DataException(HttpStatus.NOT_FOUND, "Record/s Not Found")))
            .doOnError(error -> new DataException(HttpStatus.BAD_REQUEST, "Problem while fetching Data", error));
}

如果您看到代码:

public Mono<List<AdvancesDto>> findBySearchKeys(Map<String, String> paramsMap) {

    List<AdvancesDto> advDTOList= new ArrayList<>(); //Don't do this. collectList does this already.
    return advanceRepo.findAllByKeys(
            tpNumber, vCode, arrivalNumber)
            .collectList() //Don't collect firts, transfer the data first then collect.
            .flatMap(document -> {
                AdvancesDto aa=document.get(0).dto(); // This is also wrong, document is in reality a List<Advances>, this is not a good name at all.
                advDTOList.add(aa);
                if(document.get(1)!=null) {  // Only the first two elements? And if there is more?
                aa = document.get(1).dto();
                advDTOList.add(aa);
                }
                return Mono.just(advDTOList);
            })
            .switchIfEmpty(Mono.error(new DataException(HttpStatus.NOT_FOUND, "Record/s Not Found")))
            .doOnError(error -> new DataException(HttpStatus.BAD_REQUEST, "Problem while fetching Data", error));
}

这篇关于直接从对象列表的单通道映射到DTO列表的单通道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-13 22:03