Comparator.nullsLast не избегает NullPointerException - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу отсортировать список объектов по одному из пустых полей.

Во избежание NullPointerexception я использую Comparator.nullsLast. Но исключение по-прежнему происходит:

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
    }

}

Как мне отсортировать этот список?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы должны использовать Comparator.nullsLast дважды:

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • Сначала nullsLast будет обрабатывать случаи, когда объекты Bean равны нулю.
  • Second nullsLast будет обрабатывать случаи, когда возвращаемое значение Bean::getVal равно нулю.

Если вы уверены, что в вашем списке нет значений null, вы можете пропустить первые nullsLast (как отмечено @Holger):

list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
0 голосов
/ 15 ноября 2018

Вы можете использовать:

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