Как передать List в конструктор нового объекта, используя java лямбда-выражение? - PullRequest
6 голосов
/ 11 января 2020

У меня проблема, когда Я хочу преобразовать список POJO в DTO и передать их в объект-оболочку, который затем возвращается . Рассмотрим этот рабочий фрагмент кода:

List<Device> devices = dbService.getDevices(...);
List<DeviceDTO> devicesDTO = new ArrayList<DeviceDTO>();
for (Device d : devices) {
   devicesDTO.add(convertToDTO(d));
}

WrapperDTO wrapper = new WrapperDTO(devicesDTO);

Я ищу способ переписать это в меньший, возможно, более элегантный фрагмент кода, используя Java лямбда-выражения. Это то, что я сделал до сих пор. Я могу сделать преобразование из POJO в DTO, но я изо всех сил пытаюсь передать список DTO в конструктор нового объекта-оболочки. лайнер, что-то вроде этого?

WrapperDTO wrapper = devices.stream()........collect( () -> WrapperDTO:new);

Очевидно, последний кусок не работает, но это то, чего я хотел бы достичь. Какие-либо предложения? Спасибо друзья мои:)

Ответы [ 2 ]

9 голосов
/ 11 января 2020

Вы можете использовать collectingAndThen коллектор, чтобы решить его одним махом oop. Используйте коллектор toList в качестве нижестоящего коллектора и передайте ссылку на конструктор WrapperDTO::new в качестве функции финишера. Вот как это выглядит.

final WrapperDTO wrapper = devices.stream()
    .map(d -> convertToDTO(d))
    .collect(Collectors.collectingAndThen(Collectors.toList(), WrapperDTO::new));
2 голосов
/ 11 января 2020

Существует непослушный секрет: напишите map функцию для List.

Sta sh этого маленького, и тогда все, что вам нужно:

WrapperDTO wrapper = new WrapperDTO(map(devices, MyClass::convertToDTO));

Не говорите потокам, крутые детки.

map для List должно выглядеть примерно так:

public static <T, R> List<R> map​(
    List<T> source, Function<? super T,​? extends R> mapper
) {
    List<R> result = new ArrayList<>();
    for (T item : source) {
        result.add(mapper.apply(item));
    }
    return result;
}
...