Рубрики
Без рубрики

Картографические списки с ModelMapper

Узнайте, как сопоставить списки различных типов элементов с помощью Model Mapper.

Автор оригинала: baeldung.

Картографические списки с 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. Тип токена

МодельМаппер использует ТипТокен для карты общих типов. Чтобы понять, почему это необходимо, давайте посмотрим, что происходит, когда мы целое число список характер список:

List integers = new ArrayList();
integers.add(1);
integers.add(2);
integers.add(3);

List characters = new ArrayList();
modelMapper.map(integers, characters);

Далее, если распечатать элементы символы список мы хотели бы видеть пустой список. Это связано с возникновением стирания типа во время выполнения времени выполнения.

Если мы изменим наши карта призыв к использованию ТипТокен , однако, мы можем создать тип буквально для Список :

List characters 
    = modelMapper.map(integers, new TypeToken>() {}.getType());

Во время компиляции ТокенТип анонимный внутренний случай сохраняет Список тип параметра, и на этот раз наше преобразование является успешным.

3. Использование пользовательского типа отображения

Списки в Java можно отобразить с помощью пользовательских типов элементов.

Например, предположим, что мы хотим составить карту список Пользователь сущностей к ПользовательDTO список. Для достижения этой цели мы назовем карта для каждого элемента:

List dtos = users
  .stream()
  .map(user -> modelMapper.map(user, UserDTO.class))
  .collect(Collectors.toList());

Конечно, с еще несколько работ, мы могли бы сделать общий метод параметризированных:

 List mapList(List source, Class targetClass) {
    return source
      .stream()
      .map(element -> modelMapper.map(element, targetClass))
      .collect(Collectors.toList());
}

Таким образом, мы могли бы вместо этого сделать :

List userDtoList = mapList(users, UserDTO.class);

4. Тип карты и картирования недвижимости

Конкретные свойства, такие как списки или наборы, могут быть добавлены в Пользователь-UserDTO модель. TypeMap предоставляет метод для явного определения отображения этих свойств. TypeMap объект хранит картографическую информацию определенных типов (классов):

TypeMap typeMap = 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 .