Переменная класса Java pass внутри оператора Diamond - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть сомнения в проекте Java:

public class example {

   public Data getData() {
        List<Users> users = usersService.findByClinicId(id);
        Type targetListType = new TypeToken<List<UserDTO>>() {}.getType();
        List<UserDTO> usersDTO = modelMapper.map(users, targetListType);

        List<Personas> profesionales = personasService.findProfesionalsByClinicId(id);
        targetListType = new TypeToken<List<PersonaDTO>>() {}.getType();
        List<PersonaDTO> profesionalesDTO = modelMapper.map(profesionales, targetListType);

        List<Personas> auxiliares = personasService.findAuxiliarsByClinicId(id);
        targetListType = new TypeToken<List<PersonaDTO>>() {}.getType();
        List<PersonaDTO> auxiliaresDTO = modelMapper.map(auxiliares, targetListType);

        List<Prescripciones> prescripciones = prescripcionesService.findProfesionalsByClinicId(id);
        targetListType = new TypeToken<List<PrescriptionNameDTO>>() {}.getType();
        List<PrescriptionNameDTO> prescripcionesDTO = modelMapper.map(prescripciones, targetListType);

       profesionales = entityToDTO(PersonaDTO.class, profesionales);

    ...
   }

    private <T> List<T> entityToDTO(Class<T> clazz, List<T> list) {
        Type targetListType = new TypeToken<List<clazz>>() {}.getType();
        List<PersonaDTO> auxiliaresDTO = modelMapper.map(list, targetListType);

    }
}

Идея состоит в том, чтобы уменьшить код функции getData с помощью функции entityToDTO.

У меня проблема:

  • В методе entityToDTO я хочу передать в первом параметре TypeToken требуемый тип List, но он не принимает List, где clazz - переменная с именем Class.

Есть ли способ передать внутри оператора List diamond переменную с типом класса, который я хочу использовать?

UPDATE: Идея состоит в том, чтобы уменьшить количество строк функции getData.

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Я думаю, чтобы уменьшить getData(), вам нужно добавить фильтрацию.

  1. Создать объект поискового запроса с набором переменных для фильтрации
  2. Поместить его в базу данных
  3. Сборка SQL: SearchRequest -> SQL
  4. Извлечение только тех данных из БД, которые вам нужны.

Это общий подход:

class SearchDataRequest {
   private String id;
   private Type type;
   //... other parameters 
}

public Data getData(SearchDataRequest request) {
    return reposiotry.getDataByFilter(request);
}

DAOСлой:

public Data getDataByFilter(SearchDataRequest request) {
    String sql = buildSqlForRequest(request);
    return executeSql(sql);
}
0 голосов
/ 14 ноября 2018

вы можете обновить ваш метод entityToDTO следующим образом:

public static <D, T> List<D> entityToDTO(final Collection<T> sourceList, Class<D> destinationCLass) {
        if (Objects.isNull(sourceList)) {
            return null;
        }
        return sourceList.stream().map(entity -> modelMapper.map(entity, destinationCLass))
            .collect(Collectors.toList());

   }
0 голосов
/ 14 ноября 2018

Почему бы не передать Type вместо этого?

private <T> List<T> entityToDTO(Type type, List<T> list) {
     return modelMapper.map(list, type);
}

А на стороне вызывающего абонента, например:

Type typeToUse = TypeToken.getParameterized(List.class, UserDTO.class).getType();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...