首页 > 解决方案 > 如何使用 java lambda 表达式将 List 传递给新对象的构造函数?

问题描述

我有一个问题,我想将 POJO 列表转换为 DTO,并将它们传递给一个包装器对象,然后返回。考虑这段工作代码:

List<Device> devices = dbService.getDevices(...);
List<DeviceDTO> devicesDTO = new ArrayList<DeviceDTO>();
for (Device d : devices) {
   devicesDTO.add(convertToDTO(d));
}

WrapperDTO wrapper = new WrapperDTO(devicesDTO);

我正在寻找一种使用 Java lambda 表达式将其重写为更小、可能更优雅的代码的方法。这是我到目前为止所做的。我可以进行从 POJO 到 DTO 的转换,但我正在努力将 DTO 列表传递给新包装器对象的构造函数。

List<Device> devices = dbService.getDevices(...);
List<DeviceDTO> devicesDTO = devices.stream().map(d -> convertToDTO(d)).collect(Collectors.toList());

WrapperDTO wrapper = new WrapperDTO(devicesDTO);

我怎样才能让它更短的单线,像这样的东西?

WrapperDTO wrapper = devices.stream()........collect( () -> WrapperDTO:new);

显然,最后一部分不起作用,但这是我想要实现的。有什么建议么?谢谢我的朋友们:)

标签: javalambdajava-8refactoringcollectors

解决方案


您可以使用collectingAndThen收集器一举解决。将toList收集器用作下游收集器,并将WrapperDTO::new构造函数引用作为完成器函数传递。这是它的外观。

final WrapperDTO wrapper = devices.stream()
    .map(d -> convertToDTO(d))
    .collect(Collectors.collectingAndThen(Collectors.toList(), WrapperDTO::new));

推荐阅读