Java流:如何将多个值Map到单个DTO?

ykejflvf  于 2023-02-20  发布在  Java
关注(0)|答案(2)|浏览(204)

我的Spring Boot服务方法中有一个List结果,如下所示:

Country:
String name;
List<State> states;
State:
String name;
Long population;
List<Town> towns;
Town:
String name;

我从存储库中返回国家/地区列表,其中包含每个国家/地区的所有相关州/省和城镇日期。我希望将此数据Map到DTO,如下所示:

public class CountryDTO {

    private Long id;

    private String name;

    private Long population; //population sum of states by country

    private List<Town> towns;

    //constructor
}

那么,我怎样才能正确地将我的国家实体Map到这个CountryDTO呢?我需要以下数据:
国家名称每个国家的人口总和每个国家的城镇

    • 更新:**以下是我的服务方法,我尝试使用Java Stream和ModelMapper,但无法返回所需的值:(
List<CountryDTO> countries = countryRepository.findAll().stream()
                .flatMap(x -> x.getStates().stream())
                .map(x -> new CountryDTO(x.getCountry(), <-- need to return sum of population here -->, ObjectMapperUtils.mapAll(x.getTowns(), TownDTO.class)))
                .toList();
a8jjtwal

a8jjtwal1#

  • 可以使用Stream#mapToInt获得所有状态数,然后使用.sum将它们相加。
  • Stream#flatMap可用于将每个州的所有城镇合并到单个流中。
List<CountryDTO> res = countries.stream().map(c -> new CountryDTO(c.getName(), 
      c.getStates().stream().mapToInt(State::getPopulation).sum(), 
      c.getStates().stream().flatMap(s -> s.getTowns().stream()).toList())).toList();
nwo49xxi

nwo49xxi2#

没有完全得到您的问题,如果您分享API返回的确切响应,可能会更有帮助。
但是,从用例来看,如果您要在响应中获取列表,您总是可以选择流式传输列表,迭代每个元素,然后使用条件/分组逻辑以所需的方式获取数据。
例如:假设您有一个Object类型的列表,您将其存储库层配置为ObjetRepo。现在,如果您要获取对象列表,您可以如下所示对其进行流处理:

@Autowired
private ObjectRepo objectRepo;

public List<Object> method() {
    
    
    List<Object> objects = new ArrayList<>();
    objectRepo.findAll().forEach(objects::add);
    // Here, instead of add, any other logic can be used.
    // You can also write a method, and use that method here
    // objectRepo.findAll().forEach(objects::someMethod);
    return objects; 
}

希望这个有用。

相关问题