将DTO转换为Domain模型并使用lambda返回

Den*_*nov 3 java lambda dto

我是Java的新手,所以我想问你是否存在lambda可以将一个类型对象转换为另一个类型对象的漂亮解决方案?

我有服务的职能:

public List<MyObjectDto> findAll() {
    List<MyObject> list = repository.findAll();
    return list.someMagicToConvertToDtoObjectsInList();
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

gly*_*ing 8

这里没有魔术,但是您可以流式传输列表,然后实现将map功能从域表示转换为DTO表示的功能。

例如,给定与域对象id, firstName, lastName,并用DTO id, name(其中name是的串联firstNamelastName)下面的代码...

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);
Run Code Online (Sandbox Code Playgroud)

...打印出来:

[
    MyDto{id=1, name='John Smith'}, 
    MyDto{id=1, name='Bob Bailey'}
]
Run Code Online (Sandbox Code Playgroud)

当然,使用匿名类时,上面的用法在使用时看起来有些不合适,stream()因此这是使用lambda表示的相同代码:

List<MyDto> asDto = domain.stream().map(
        s -> new MyDto(s.getId(), s.getFirstName() + " " + s.getLastName())
).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 足够公平-有点是在提到它们“不相等”。Lambda将使用`invokedynamic`,并且可能会显着提高性能。 (2认同)

Syn*_*ync 5

通过使用流,您可以使用以下内容:

public List<MyObjectDTO> findAll() {
    List<MyObject> list = repository.findAll();
    return list.stream()
            .map(MyObjectDTO::new)
            .collect(Collectors.toCollection(ArrayList::new));
}
Run Code Online (Sandbox Code Playgroud)

为此,您的 DTO 类需要有一个接受域模型的构造函数:

public class MyObjectDTO {

    // fields

    public MyObjectDTO(MyObject myObject) {
        // map MyObject fields to MyObjectDTO fields
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

参数构造函数的替代方法是将转换封装在方法中,例如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)