将 DTO 转换为域模型并使用 lambda 返回
Convert DTO to Domain models and back with lambda
我是 Java 的新人,所以我想问你是否存在一些漂亮的 lambda 解决方案,可以将一种类型的对象转换为另一种类型的对象?
我在服务中发挥作用:
public List<MyObjectDto> findAll() {
List<MyObject> list = repository.findAll();
return list.someMagicToConvertToDtoObjectsInList();
}
有什么想法吗?
这里没有魔法,但您可以流式传输列表,然后实现 map
函数以从域表示转换为 DTO 表示。
例如,给定一个具有 id, firstName, lastName
的域对象和一个具有 id, name
的 DTO(其中 name
是 firstName
和 lastName
的串联)以下代码 ...
List<MyObject> domain = new ArrayList<>();
domain.add(new MyObject(1, "John", "Smith"));
domain.add(new MyObject(1, "Bob", "Bailey"));
// using the verbose statement of function (rahter than a lambda)
// to make it easier to see how the map function works
List<MyDto> asDto = domain.stream().map(new Function<MyObject, MyDto>() {
@Override
public MyDto apply(MyObject s) {
// a simple mapping from domain to dto
return new MyDto(s.getId(), s.getFirstName() + " " + s.getLastName());
}
}).collect(Collectors.toList());
System.out.println(asDto);
... 打印出:
[
MyDto{id=1, name='John Smith'},
MyDto{id=1, name='Bob Bailey'}
]
当然,上面使用匿名 class 在使用 stream()
时看起来有些不合适,所以这里是使用 lambda 表示的相同代码:
List<MyDto> asDto = domain.stream().map(
s -> new MyDto(s.getId(), s.getFirstName() + " " + s.getLastName())
).collect(Collectors.toList());
通过使用流,您可以使用以下内容:
public List<MyObjectDTO> findAll() {
List<MyObject> list = repository.findAll();
return list.stream()
.map(MyObjectDTO::new)
.collect(Collectors.toCollection(ArrayList::new));
}
为此,您的 DTO class 需要有一个接受您的域模型的构造函数:
public class MyObjectDTO {
// fields
public MyObjectDTO(MyObject myObject) {
// map MyObject fields to MyObjectDTO fields
}
}
编辑
参数构造函数的替代方法是将转换封装在一个方法中,例如:
public class Service {
public List<MyObjectDto> findAll() {
List<MyObject> list = repository.findAll();
return list.stream()
.map(Service::convert)
.collect(Collectors.toCollection(ArrayList::new));
}
private MyObjectDTO convert(MyObject myObject) {
// conversion here
}
}
我是 Java 的新人,所以我想问你是否存在一些漂亮的 lambda 解决方案,可以将一种类型的对象转换为另一种类型的对象?
我在服务中发挥作用:
public List<MyObjectDto> findAll() {
List<MyObject> list = repository.findAll();
return list.someMagicToConvertToDtoObjectsInList();
}
有什么想法吗?
这里没有魔法,但您可以流式传输列表,然后实现 map
函数以从域表示转换为 DTO 表示。
例如,给定一个具有 id, firstName, lastName
的域对象和一个具有 id, name
的 DTO(其中 name
是 firstName
和 lastName
的串联)以下代码 ...
List<MyObject> domain = new ArrayList<>();
domain.add(new MyObject(1, "John", "Smith"));
domain.add(new MyObject(1, "Bob", "Bailey"));
// using the verbose statement of function (rahter than a lambda)
// to make it easier to see how the map function works
List<MyDto> asDto = domain.stream().map(new Function<MyObject, MyDto>() {
@Override
public MyDto apply(MyObject s) {
// a simple mapping from domain to dto
return new MyDto(s.getId(), s.getFirstName() + " " + s.getLastName());
}
}).collect(Collectors.toList());
System.out.println(asDto);
... 打印出:
[
MyDto{id=1, name='John Smith'},
MyDto{id=1, name='Bob Bailey'}
]
当然,上面使用匿名 class 在使用 stream()
时看起来有些不合适,所以这里是使用 lambda 表示的相同代码:
List<MyDto> asDto = domain.stream().map(
s -> new MyDto(s.getId(), s.getFirstName() + " " + s.getLastName())
).collect(Collectors.toList());
通过使用流,您可以使用以下内容:
public List<MyObjectDTO> findAll() {
List<MyObject> list = repository.findAll();
return list.stream()
.map(MyObjectDTO::new)
.collect(Collectors.toCollection(ArrayList::new));
}
为此,您的 DTO class 需要有一个接受您的域模型的构造函数:
public class MyObjectDTO {
// fields
public MyObjectDTO(MyObject myObject) {
// map MyObject fields to MyObjectDTO fields
}
}
编辑
参数构造函数的替代方法是将转换封装在一个方法中,例如:
public class Service {
public List<MyObjectDto> findAll() {
List<MyObject> list = repository.findAll();
return list.stream()
.map(Service::convert)
.collect(Collectors.toCollection(ArrayList::new));
}
private MyObjectDTO convert(MyObject myObject) {
// conversion here
}
}