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

为了避免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
    }

}

我如何对这种列表进行排序?

最佳答案

您应该使用Comparator.nullsLast两次:

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
  • 第一个nullsLast将处理Bean对象为null的情况。
  • 第二个nullsLast将处理Bean::getVal的返回值为null的情况。

  • 如果您确定列表中没有null值,则可以省略第一个nullsLast(如@Holger所指出):
    list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
    

    关于java - Comparator.nullsLast不能避免NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53314193/

    10-11 05:00