【问题标题】:using java8 stream api to convert one object to another使用 java8 流 api 将一个对象转换为另一个
【发布时间】:2020-04-10 04:40:51
【问题描述】:

我正在开发一个 SpringBoot 项目。

我有一个Car 模型类:

public class Car {
   private String plateNumber;
   private CarType type;
   private String brand
}

有一个CarType 枚举:

public enum CarType {
   HATCH_BACK, SEDAN, SUV
}

在我的 DTO 层中,我有一个 CarDTO 类:

public class CarDTO {
       private String plateNumber;
       private String type;
       private String brand
}

CarCarDTO 之间的唯一区别是 CarDTO 中的 type 属性是 String 而在 Cartype 属性是 CarType)。

在 Controller 中,我在请求负载中得到了一个 CarDTO 列表:

List<CarDTO> carsFromReq = request.getCars();

我想从List&lt;CarDTO&gt; 中得到一个List&lt;Car&gt;,如何使用Java8 流API 来实现?

【问题讨论】:

  • 你有没有尝试过?

标签: java spring-boot java-8 dto


【解决方案1】:

在 CarDTO 中创建一个全参数构造函数。 您可以将 lombok 的@AllArgsConstructor 用于所有参数构造函数。

然后在.map()中创建CarDTO对象

List<CarDTO> carsFromReq = request.getCars().stream()
    .map(car-> new CarDTO(car.getPlateNumber(),car.getType().name(),car.getBrand()))
    .collect(Collectors.toList());

【讨论】:

  • 你试过这个解决方案了吗?
【解决方案2】:

尝试使用MapStruct。它静态生成映射器实现,因此您不必手动映射每个字段。

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

    Car map(CarDTO car);

    CarDTO map(Car car);

    List<CarDTO> map(Iterable<Car> car);

    List<Car> mapDtos(Iterable<CarDTO> car);

}

那么你就可以像下面这样简单地使用它了:

 CarDTO dto = CarMapper.INSTANCE.map(car);
 // ...
 Car car2 = CarMapper.INSTANCE.map(dto);
 // ...
 List<Car> cars = CarMapper.INSTANCE.mapDtos(dtos);
 // ...
 List<CarDTO> dtos = CarMapper.INSTANCE.map(cars);

注意: 实际上,官方MapStruct 网站有一个与您的示例非常相似的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2018-09-18
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多