Voici un problème auquel j’ai été confronté plus d’une fois : trier en java des éléments en fonction d’un de ses attributs … qui peut être null.
La méthode classique pour faire ça : le bon vieux comparateur, mais qui devient vite compliqué avec les test de nullité :
1 | Comparator<MonBean> byLibelle = new Comparator<MonBean>() { |
2 | public int compare( final MonBean b1, final MonBean b2) { |
3 | if (b1.getLibelle() == null ) { |
5 | if (b2.getLibelle() == null ) { |
12 | if (b2.getLibelle() == null ) { |
17 | return b1.getLibelle().compareTo(b2.getLibelle()); |
20 | Collections.sort(myList, byLibelle); |
Bon, c’est un peu bourrin, moche, mais ça fonctionne.
Voici une autre solution beaucoup plus élégante utilisant la classe Ordering de Guava :
1 | Comparator<MonBean> byLibelle = new Comparator<MonBean>() { |
2 | public int compare( final MonBean b1, final MonBean b2) { |
3 | return Ordering.natural(). |
5 | compare(b1.getLibelle(), |
9 | Collections.sort(myList, byLibelle); |
Ici, Ordering.natural().nullsFirst()
retourne une instance de la classe Ordering effectuant un classement par ordre naturel avec les éléments nulls en premier. Simple non ?
Ce qu’il faut retenir, c’est qu’Ordering est un Comparator aux hormones permettant d’effectuer des tris multiples, d’appliquer une fonction sur les éléments avant le tri, etc …
[ Ordering, Javadoc ]