Comparator.nullsLast不会避免NullPointerException

rel*_*ood 9 java collections comparator java-8 java-stream

我想通过一个可空字段对对象列表进行排序.

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

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能对这种清单进行排序?

ETO*_*ETO 16

你应该使用Comparator.nullsLast两次:

list.sort(nullsLast(comparing(Bean::getVal, nullsLast(naturalOrder()))));
Run Code Online (Sandbox Code Playgroud)
  • 首先nullsLast将处理Bean对象为null 时的情况.
  • 第二个nullsLast将处理返回值为Bean::getValnull时的情况.

如果你确定null列表中没有任何值,那么你可以省略第一个nullsLast(如@Holger所述):

list.sort(comparing(Bean::getVal, nullsLast(naturalOrder())));
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果 bean 永远不是 `null`,则省略外部的 `nullsLast`,即只有属性值可能是 `null`。 (3认同)

Nam*_*man 9

你可以使用:

Collections.sort(l, Comparator.comparing(Bean::getVal,
                              Comparator.nullsLast(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)