Depuis Date
implémente Comparable
, il a une compareTo
méthode commeString
fait.
Ainsi, votre coutume Comparator
pourrait ressembler à ceci:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
La compare()
méthode doit renvoyer un int
, vous ne pouvez donc pas retourner directement unboolean
comme vous l'aviez prévu de toute façon.
Votre code de tri serait à peu près comme vous l'avez écrit:
Collections.sort(Database.arrayList, new CustomComparator());
Une manière légèrement plus courte d'écrire tout cela, si vous n'avez pas besoin de réutiliser votre comparateur, est de l'écrire en tant que classe anonyme en ligne:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Vous pouvez maintenant écrire le dernier exemple sous une forme plus courte en utilisant une expression lambda pour Comparator
:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Et List
a une sort(Comparator)
méthode, vous pouvez donc raccourcir encore plus:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
C'est un idiome si courant qu'il existe une méthode intégrée pour générer un Comparator
pour une classe avec une Comparable
clé:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Tous ces éléments sont des formes équivalentes.