web-dev-qa-db-fra.com

Comparator.nullsLast n'évite pas NullPointerException

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?

14
rellocs wood

Tu devrais utiliser Comparator.nullsLast deux fois:

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • Le premier nullsLast gérera les cas où les objets Bean seront nuls.
  • Le deuxième 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())));
14
ETO

Vous pouvez éventuellement utiliser:

Collections.sort(l, Comparator.comparing(Bean::getVal,
                              Comparator.nullsLast(Comparator.naturalOrder())));
1
Naman