Сортировка обобщенного c списка объектов с переменной вложенных объектов в качестве ключа - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть список объектов, которые я сортирую по названию данного метода. Эта сортировка первого уровня работает нормально. У меня проблемы с сортировкой по ключу, который является членом вложенного объекта. Любые предложения будут полезны, вот что я получил до сих пор.

Пример объекта с вложенным объектом

public class User{

    private String userName;
    private String userLastName;
    private UserDob userDob;

    ... 
}

public class UserDob{
    private int year;
    private int month;
    private int day;
    ...
}

Попытка сортировки по UserDob.year не работает с приведенным ниже решением.

public static <T> List<T> sortListOfObjects(T object, List<T> unsortedList, String key, char order) throws NoSuchMethodException {
        if(object == null || unsortedList == null || unsortedList.size() == 0){
            return null;
        }

        Method[] methods = object.getClass().getDeclaredMethods();

        for(int i = 0; i < methods.length; i++){
            String methodName = methods[i].getName();
            if(methodName != null && methodName.equalsIgnoreCase("get" + key)){
                Function comparingMethodName = getObjectComparingMethod(methodName);

                Comparator comparator = Comparator.comparing(comparingMethodName);

                if(order == 'd'){
                    Collections.sort(unsortedList, comparator.reversed());
                }else{
                    Collections.sort(unsortedList, comparator);
                }

                break;
            }
        }

        return unsortedList;
    }

    @NotNull
    private static <T, U> Function<T, U> getObjectComparingMethod(String methodName) {
        return (T tClass)-> {
            Object returnObject = null;
            try {
                Method method = tClass.getClass().getMethod(methodName, new Class[]{});
                returnObject = method.invoke(tClass);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }

            return (U) returnObject;
        };
    }
...