Diamond运算符中的Java传递类变量

时间:2018-11-14 10:57:16

标签: java java-8

我对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中,我想将想要的List类型传递给TypeToken第一个参数,但它不接受List,其中clazz是具有类名称的变量。

是否可以在List菱形运算符内部传递一个要使用的类类型的变量?

更新: 这个想法是为了减少getData函数的行数。

3 个答案:

答案 0 :(得分:6)

为什么不通过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();

答案 1 :(得分:1)

您可以按如下所示更新您的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());

   }

答案 2 :(得分:0)

我认为,要减少for view in self.view.subviews { if view != viewYouWantToExclude { view.addGestureRecognizer(tap) } } ,您应该添加过滤条件。

  1. 使用一组要过滤的变量创建搜索请求对象
  2. 将其放入数据库
  3. 构建SQL:SearchRequest-> SQL
  4. 仅从数据库中检索所需的数据。

这是通用方法:

getData()

DAO层:

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

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