Java. Отсортировать даты по месяцам, используя Streams

У меня есть List<Date>, с датами в формате d/MMMM/yyyy, их нужно отсортировать по месяцам используя STREAM.

То есть, если есть:

4/February/2020
6/February/1990
11/April/2012
30/August/2011
8/September/2009
25/May/2021

То в итоге должно получиться:

6/February/1990
4/February/2020
11/April/2012
25/May/2021
30/August/2011
8/September/2009

Вот мой код, он просто сортирует по возрастанию:

public static List<Date> comp(List<Date> list){

    return list.stream()
        .sorted(Comparator.naturalOrder())
        .collect(Collectors.toList());
} 

Но как сделать как мне нужно я не знаю.


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

Автор решения: Alex Rudenko

Нужно преобразовать в нормальный тип для работы с датой LocalDate и отсортировать его, затем преобразовать обратно если нужно возвращать именно List<Date>:

public static List<Date> comp(List<Date> list){
    return list.stream()
        .map(d -> d.toInstant()
            .atZone(ZoneId.systemDefault()).toLocalDate())
        .sorted(Comparator.comparingInt(LocalDate::getMonthValue)
            .thenComparingInt(LocalDate::getYear))
        .map(ld -> Date.from(ld.atStartOfDay()
            .atZone(ZoneId.systemDefault()).toInstant()))
        .collect(Collectors.toList());
}

Тест:

6/Feb/1990
4/Feb/2020
11/Apr/2012
25/May/2021
30/Aug/2011
8/Sep/2009
→ Ссылка