Картографические списки с ModelMapper
1. Обзор
В этом учебнике мы объясним, как сопоставить списки различных типов элементов с помощью МодельМаппер каркас. T его включает в себя использование общих типов в Java в качестве решения для преобразования различные типы данных из одного списка в другой .
2. Модель Mapper
Основная роль ModelMapper заключается в картировании объектов путем определения того, как одна модель объекта отображается на другой, называемой объектом преобразования данных (DTO).
Для того, чтобы МодельМаппер , мы начинаем с добавления зависимости к нашей пом.xml :
org.modelmapper modelmapper 2.3.7
2.1. Конфигурация
ModelMapper предоставляет различные конфигурации для упрощения процесса отображения. Мы настраиваем конфигурацию, включив или отключив соответствующие свойства в . Это обычной практикой для fieldMatchingEnabled имущество для истинное и разрешить частное поле соответствия :
modelMapper.getConfiguration() .setFieldMatchingEnabled(true) .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
Поступая таким образом, ModelMapper может сравнить частные поля в классах отображения (объекты). В этой конфигурации не обязательно, чтобы все поля с одинаковыми именами существовали в обоих классах. Несколько Соответствие стратегии допускаются. По умолчанию стандартная стратегия сопоставления требует, чтобы все свойства источника и назначения соответствовали в любом порядке. Это идеально подходит для нашего сценария .
2.2. Тип токена
МодельМаппер использует ТипТокен для карты общих типов. Чтобы понять, почему это необходимо, давайте посмотрим, что происходит, когда мы целое число список характер список:
Listintegers = new ArrayList (); integers.add(1); integers.add(2); integers.add(3); List characters = new ArrayList (); modelMapper.map(integers, characters);
Далее, если распечатать элементы символы список мы хотели бы видеть пустой список. Это связано с возникновением стирания типа во время выполнения времени выполнения.
Если мы изменим наши карта призыв к использованию ТипТокен , однако, мы можем создать тип буквально для Список
Listcharacters = modelMapper.map(integers, new TypeToken >() {}.getType());
Во время компиляции ТокенТип анонимный внутренний случай сохраняет Список
3. Использование пользовательского типа отображения
Списки в Java можно отобразить с помощью пользовательских типов элементов.
Например, предположим, что мы хотим составить карту список Пользователь сущностей к ПользовательDTO список. Для достижения этой цели мы назовем карта для каждого элемента:
Listdtos = users .stream() .map(user -> modelMapper.map(user, UserDTO.class)) .collect(Collectors.toList());
Конечно, с еще несколько работ, мы могли бы сделать общий метод параметризированных:
ListmapList(List source, ClasstargetClass) { return source .stream() .map(element -> modelMapper.map(element, targetClass)) .collect(Collectors.toList()); }
Таким образом, мы могли бы вместо этого сделать :
ListuserDtoList = mapList(users, UserDTO.class);
4. Тип карты и картирования недвижимости
Конкретные свойства, такие как списки или наборы, могут быть добавлены в Пользователь-UserDTO модель. TypeMap предоставляет метод для явного определения отображения этих свойств. TypeMap объект хранит картографическую информацию определенных типов (классов):
TypeMaptypeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class);
Список пользователей класс содержит коллекцию Пользователь s. Вот, w e хотите сопоставить список имен пользователей из этой коллекции со списком свойств из ПользовательListDTO класс . Для достижения этой цели мы создадим первую ПользователиListConverter класса и передать его Список
public class UsersListConverter extends AbstractConverter, List
> { @Override protected List convert(List users) { return users .stream() .map(User::getUsername) .collect(Collectors.toList()); } }
Из созданного TypeMap объект, который мы явно добавить Карта недвижимости ссылаясь на пример ПользователиListConverter класс:
typeMap.addMappings(mapper -> mapper.using(new UsersListConverter()) .map(UserList::getUsers, UserListDTO::setUsernames));
Внутри addMappings метод, отображение выражения позволяет определить источник назначения свойств с выражениями lambda. Наконец, он преобразует список пользователей в полученный список имен пользователей.
5. Заключение
В этом учебнике мы объяснили, как списки отображаются путем манипулирования общими типами в ModelMapper . Мы можем воспользоваться ТипТокен, общее отображение типов и отображение свойств для создания типов списка объектов и сложных карт.
Полный исходный код этой статьи доступен более на GitHub .