Comparator.nullsLast 并不能避免 NullPointerException

我想按可为空的字段之一对对象列表进行排序。

为了避免我使用.但例外情况仍然会发生:NullPointerexceptionComparator.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
    }

}

如何对此类列表进行排序?


答案 1

您应该使用两次:Comparator.nullsLast

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • 首先将处理对象为 null 的情况。nullsLastBean
  • Second 将处理返回值为 null 的情况。nullsLastBean::getVal

如果您确定列表中没有任何值,则可以省略第一个值(如@Holger所述):nullnullsLast

list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));

答案 2

您可以使用:

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