Сортировка даты XMLGregorianCalendar в Stream

Есть код:

    Collection<Project> projects = projectsRep.stream()
            .filter(t -> t.getDateFinish() != null)
            .sorted(Comparator.comparing(Project::getDateFinish))
            .collect(Collectors.toList());
    printTasks(projects);

Метод getDateFinish() возвращает дату в формате XMLGregorianCalendar и отказывается сортировать. Как отсортировать эту коллекцию по дате? При типе даты Date() все хорошо сортирует. Ругается здесь: Project::getDateFinish


Ответы (1 шт):

Автор решения: Дмитрий

В этом случае вам нужен компаратор. Выглядит он как отдельный класс:

import java.util.Comparator;
import javax.xml.datatype.XMLGregorianCalendar;

public class DateComparator implements Comparator<XMLGregorianCalendar>{
    @Override
    public int compare(XMLGregorianCalendar date1, XMLGregorianCalendar date2) {
        return date1.compare(date2);
    }
}

А теперь добавим его в наш стрим:

Collection<Project> projects = projectsRep.stream()
        .filter(t -> t.getDateFinish() != null)
        .sorted(Comparator.comparing(Project::getDateFinish, new DateComparator()))
        .collect(Collectors.toList());

Либо боле короткий вариант:

Collection<Project> projects = projectsRep.stream()
        .filter(t -> t.getDateFinish() != null)
        .sorted(Comparator.comparing(Project::getDateFinish, XMLGregorianCalendar::compare).reversed())
        .collect(Collectors.toList());
→ Ссылка