java 8, trier la liste des objets par attribut sans comparateur personnalisé

Quel est le moyen le plus court de faire cela ?

 class AnObject{
     Long  attr;
 }

 List<AnObject> list; 

Je sais que cela peut être fait avec un comparateur personnalisé pour AnObject. N'y a-t-il pas quelque chose de prêt pour un tel cas ? type de

 Collections.sort(list, X.attr ) ;
24
demandé sur JB Nizet 2015-11-03 00:15:44

3 réponses

En supposant que vous avez réellement un List<AnObject>, Tout ce dont vous avez besoin est

list.sort(Comparator.comparing(a -> a.attr));

Si vous vous faites nettoyer le code en n'utilisant pas de champs publics, mais des méthodes d'accesseur, cela devient encore plus propre:

list.sort(Comparator.comparing(AnObject::getAttr));
69
répondu JB Nizet 2015-11-02 21:27:13

En complément de la réponse de @JB Nizet, si votre attr est nullable,

list.sort(Comparator.comparing(AnObject::getAttr));

Peut lancer un NPE.

Si vous souhaitez également trier les valeurs nulles, vous pouvez considérer

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder())));

Ou

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder())));

Qui mettra nulls en premier ou en dernier.

3
répondu Alex 2017-11-30 03:42:48

Une option null-safe pour la réponse de JB Nizet et Alex ci-dessus serait de faire ce qui suit:

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder())));

Ou

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder())));
1
répondu Warren Crasta 2018-03-06 03:07:46