Desde Date
implementa Comparable
, ele tem um compareTo
método como String
faz.
Portanto, seu costume Comparator
pode ficar assim:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
O compare()
método deve retornar um int
, para que você não possa retornar diretamente um boolean
como estava planejando.
Seu código de classificação seria exatamente como você escreveu:
Collections.sort(Database.arrayList, new CustomComparator());
Uma maneira um pouco mais curta de escrever tudo isso, se você não precisar reutilizar seu comparador, é escrevê-lo como uma classe anônima embutida:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Agora você pode escrever o último exemplo em um formato mais curto usando uma expressão lambda para Comparator
:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
E List
possui um sort(Comparator)
método, para que você possa encurtar ainda mais:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Esse é um idioma tão comum que existe um método interno para gerar a Comparator
para uma classe com uma Comparable
chave:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Todos estes são formas equivalentes.