使用Java 8的Stream API将一个对象转换为另一个对象。

huangapple 未分类评论47阅读模式
英文:

using java8 stream api to convert one object to another

问题

我正在开发一个 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;
    }

(`Car``CarDTO` 之间唯一的区别在于`CarDTO`,`type` 属性是一个 `String`,而在 `Car`,`type` 属性是一个 `CarType`)。

在控制器中我从请求载荷中获得了一个 CarDTO 列表

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

我想要从 `List<CarDTO>` 中获取一个 `List<Car>`,如何使用 Java 8 的流 API 实现

(注意:我只翻译了你要求的内容,没有包括“不要回答我要翻译的问题”这句话。)

英文:

I am developing a SpringBoot project.

I have a Car model class:

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

There is a CarType enum:

public enum CarType {
   HATCH_BACK, SEDAN, SUV
}

In my DTO layer, I have a CarDTO class:

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

(The only difference between Car and CarDTO is that in CarDTO the type property is a String whereas in Car the type property is a CarType).

In Controller, I got a List of CarDTO in request payload:

List&lt;CarDTO&gt; carsFromReq = request.getCars();

I would like to get a List&lt;Car&gt; out from List&lt;CarDTO&gt;, how to achieve that with Java8 stream API?

答案1

得分: 0

在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());
英文:

Create an all argument constructor in CarDTO.
You can use @AllArgsConstructor of lombok for all argument constructor.

Then create CarDTO object in .map()

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

答案2

得分: 0

尝试使用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网站有一个与您的示例非常相似的例子。

英文:

Try using MapStruct. It generates the mapper implementations statically, so you don't have to map each and every field manually.

@Mapper
public interface CarMapper {

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

    Car map(CarDTO car);

    CarDTO map(Car car);

    List&lt;CarDTO&gt; map(Iterable&lt;Car&gt; car);

    List&lt;Car&gt; mapDtos(Iterable&lt;CarDTO&gt; car);

}

Then you can use a it as simple as follows:

 CarDTO dto = CarMapper.INSTANCE.map(car);
 // ...
 Car car2 = CarMapper.INSTANCE.map(dto);
 // ...
 List&lt;Car&gt; cars = CarMapper.INSTANCE.mapDtos(dtos);
 // ...
 List&lt;CarDTO&gt; dtos = CarMapper.INSTANCE.map(cars);

Note:
Actually the official MapStruct site has an example pretty similar to your one.

huangapple
  • 本文由 发表于 2020年4月10日 12:40:51
  • 转载请务必保留本文链接:https://java.coder-hub.com/61134146.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定