Java Интерфейс компаратора NullsLast с анонимным внутренним классом - PullRequest
0 голосов
/ 06 апреля 2020

Я создал метод, который возвращает необработанные html для таблицы в java на основе заданной сущности (я использую JPA). Теперь я хотел бы иметь возможность сортировать таблицу с помощью компаратора. Поэтому я создал анонимный внутренний класс интерфейса компаратора для сортировки по атрибутам сущностей. Это работает нормально, но моя проблема сейчас в том, что я не могу отсортировать NullsFirst или Nullslast. Все, что я пробовал, не работает. У кого-нибудь есть идеи, как это решить?

Это код:

if (!sortProperty.equals("") && sortProperty != null) {
        Collections.sort(list, new Comparator<T>() {
            public int compare(T e1, T e2) {
                Method sortGetter = null;
                try {
                    for (PropertyDescriptor pd : Introspector.getBeanInfo(entity).getPropertyDescriptors()) {
                        if (pd.getName().equals(sortProperty) && pd.getReadMethod() != null) {
                            sortGetter = pd.getReadMethod();
                        }
                    }
                } catch (IntrospectionException e) {
                    e.printStackTrace();
                }

                try {
                        if (sortGetter.getReturnType().equals(String.class)) {
                            return sortGetter.invoke(e1).toString().compareTo(sortGetter.invoke(e2).toString());
                        } else if (sortGetter.getReturnType().equals(Integer.TYPE)) {
                                return (Integer) sortGetter.invoke(e1) - (Integer) sortGetter.invoke(e2);
                        } else if (sortGetter.getReturnType().equals(Date.class)) {
                                return ((Date) sortGetter.invoke(e1)).compareTo((Date) sortGetter.invoke(e2));
                        } else if (sortGetter.getReturnType().equals(Timestamp.class)) {
                                return ((Timestamp) sortGetter.invoke(e1)).compareTo((Timestamp) sortGetter.invoke(e2));
                        }
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }

1 Ответ

1 голос
/ 06 апреля 2020

Извлеките свои sortGetter.invoke(e1) и sortGetter.invoke(e2) в переменные (try / catch для ясности опущен):

Object o1 = sortGetter.invoke(e1);
Object o2 = sortGetter.invoke(e2);

Проверьте, имеет ли значение null, и если да, верните:

if (o1 == null || o2 == null) {
  // This results in nulls last. Use != for nulls first.
  return Boolean.compare(o1 == null, o2 == null);
}

Теперь вы можете продолжить работу со своим if (sortGetter.getReturnType().equals(String.class)) -типом c (вам, очевидно, не нужно снова вызывать sortGetter.invoke(e1) и sortGetter.invoke(e2)).

...