Ponieważ Date
implementuje Comparable
, ma taką compareTo
samą metodę jak String
.
Twój zwyczaj Comparator
moż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ą boolean
się 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 List
ma 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 Comparator
klasy dla Comparable
klucza z kluczem:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Wszystkie są równoważnymi formami.