Преобразование из Entity в Dto
Мне нужно из листа получить мапу с помощью стрима.
У меня метод который должный все это сделать, он принимает 2 параметра List
protected <T,R> Map<Integer, List<R>> mapToMap(Collection<T> values, Function<T, R> mapper) {
}
Первый параметр value это лист объектов в которых есть некоторые поля и id.
Второй параметр это обычный метод map, который принимает Entity и возвращает Dto
Что в итоге получается, в DTO нет поля id, но оно есть у Entity. Мне нужно сделать Map<Integer, List<DTO>>(ключ для мапы мы должны взять из Entity, он там хранится полем) из List<Entity>(вместо Entity другой класс)
Пока что я дошел только до того, что могу из Entity достать ключ и сделать мапу
values.stream()
.collect(Collectors.groupingBy(Entity::getId))
но дальше я не понимаю, как мне размапить поля в Entity. Основная задача сделать мапинг из Entityt в Dto
Ответы (1 шт):
В данном методе следует "типизировать" T, так как не всякий тип T имеет метод getId.
Затем в Collectors.groupingBy использовать дополнительно Collectors.mapping, вызвать метод apply в маппере и собрать DTO в список:
protected <T extends Entity, R> Map<Integer, List<R>> mapToMap(
Collection<T> values, Function<T, R> mapper
) {
return values.stream()
.collect(Collectors.groupingBy(
Entity::getId,
Collectors.mapping(mapper::apply, Collectors.toList())
));
}
Также можно дополнительно указать тип идентификатора как дженерик, соответственно, его нужно будет указать в Entity:
public interface Entity<T> {
T getId();
}
// ....
protected <T extends Entity<K>, K, R> Map<K, List<R>> mapToMap(
Collection<T> values, Function<T, R> mapper
) {
return values.stream()
.collect(Collectors.groupingBy(
Entity::getId,
Collectors.mapping(mapper::apply, Collectors.toList())
));
}
Если используется Spring JPA, то в качестве Entity можно взять интерфейс Persistable<ID>.