英文:
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<CarDTO> carsFromReq = request.getCars();
I would like to get a List<Car>
out from List<CarDTO>
, 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<CarDTO> carsFromReq = request.getCars().stream()
.map(car-> 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<CarDTO> map(Iterable<Car> car);
List<Car> mapDtos(Iterable<CarDTO> car);
}
Then you can use a it as simple as follows:
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);
Note:
Actually the official MapStruct site has an example pretty similar to your one.
专注分享java语言的经验与见解,让所有开发者获益!
评论