Ponieważ Dateimplementuje Comparable, ma taką compareTosamą metodę jak String.
Twój zwyczaj Comparatormoże wyglądać następująco:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
compare()Metoda musi zwracać liczbę int, więc nie można bezpośrednio zwracają booleansię jak planowaliśmy tak.
Twój kod sortowania będzie mniej więcej taki, jak napisałeś:
Collections.sort(Database.arrayList, new CustomComparator());
Nieco krótszym sposobem napisania tego wszystkiego, jeśli nie trzeba ponownie używać komparatora, jest napisanie go jako wbudowanej anonimowej klasy:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Możesz teraz napisać ostatni przykład w krótszej formie, używając wyrażenia lambda dla Comparator:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
I Listma sort(Comparator)metodę, dzięki czemu możesz jeszcze bardziej ją skrócić:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Jest to tak powszechny idiom, że istnieje wbudowana metoda generowania Comparatorklasy dla Comparableklucza z kluczem:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Wszystkie są równoważnymi formami.