Java конвертировать Spring Data Sort в Comparator - PullRequest
0 голосов
/ 25 января 2020

Я создал приложение Spring Boot, которое использует класс Spring Data Sort для сортировки объектов в моей базе данных. Однако, по соображениям согласованности, я также хотел бы применить этот механизм сортировки к общим спискам или потокам и, следовательно, должен преобразовать его в Comparator.

. Я нашел решение, но чувствую, что есть более элегантный и / или безопасный для типов способ сделать это. Любой совет?

import org.springframework.data.domain.Sort;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Comparator;
import java.util.Iterator;

public class ComparatorUtils {
    public static <T> Comparator<T> convert(Sort sort, Class<T> type) {
        final Iterator<Sort.Order> orderIterator = sort.iterator();
        final Sort.Order order = orderIterator.next();

        Comparator<T> comparator = convert(order, type);
        while (orderIterator.hasNext()) {
            comparator = comparator.thenComparing(convert(orderIterator.next(), type));
        }

        return comparator;
    }

    private static <T> Comparator<T> convert(Sort.Order order, Class<T> type) {
        Comparator<T> comparator = Comparator.comparing((T entity) -> {
            try {
                return (Comparable) new PropertyDescriptor(order.getProperty(), type).getReadMethod().invoke(entity);
            } catch (IllegalAccessException | InvocationTargetException | IntrospectionException e) {
                throw new RuntimeException(e);
            }
        });

        if (order.isDescending())
            return comparator.reversed();
        return comparator;
    }
}

1 Ответ

0 голосов
/ 04 марта 2020
  • Используйте org.springframework.beans.BeanUtils.getPropertyDescriptor, где дескрипторы кэшируются (вместо нового PropertyDescriptor).
  • Это решение не обрабатывает сортировку по более глубоким полям (например, Person.Address .Street)
  • Нулевые значения обрабатываются неправильно. Используйте Comparator.nullsFirst или nullsLast.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...