Je veux trier une liste d'objets par l'un des champs nullables.
Afin d'éviter NullPointerexception
j'utilise Comparator.nullsLast
. Mais l'exception se produit toujours:
public class Test {
public static void main(String[] args) {
List<Bean> l = new ArrayList<>();
for (int i=0;i<5;i++) {
Bean b = new Bean("name_"+i,i);
l.add(b);
}
l.get(2).setVal(null);
System.out.println(l);
Collections.sort(l, Comparator.nullsLast(Comparator.comparing(Bean::getVal)));
System.out.println(l);
}
static class Bean{
String name;
Integer val;
// omit getters & setters & constructor
}
}
Comment trier ce type de liste?
Tu devrais utiliser Comparator.nullsLast
deux fois:
list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
nullsLast
gérera les cas où les objets Bean
seront nuls.nullsLast
gérera les cas où la valeur de retour de Bean::getVal
est nul.Dans le cas où vous êtes sûr qu'il n'y a pas de valeurs null
dans votre liste, vous pouvez omettre la première nullsLast
(comme indiqué par @Holger):
list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
Vous pouvez éventuellement utiliser:
Collections.sort(l, Comparator.comparing(Bean::getVal,
Comparator.nullsLast(Comparator.naturalOrder())));