具有空安全比较器的 Comparator.nullsFirst

nim*_*o23 6 java-8

我想要一个空安全比较器,但它不起作用:

Comparator<Item> sort_high = (i1, i2)-> Double.compare(i2.getUser().getValue(), i1.getUser().getValue());

items.sort(Comparator.nullsFirst(sort_high));
Run Code Online (Sandbox Code Playgroud)

但是,如果 item.getUser().getValue() (或 item.getUser()) 为 null,我会得到 NPE。

at Item.lambda$1(Item.java:270)
    at java.util.Comparators$NullComparator.compare(Comparators.java:83)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.util.TimSort.sort(TimSort.java:220)
    at java.util.Arrays.sort(Arrays.java:1438)
    at java.util.List.sort(List.java:478)
Run Code Online (Sandbox Code Playgroud)

怎么了?

Ami*_*mit 8

nullsFirst将处理 null Items (" i1"),但是一旦找到两个有效对象,您的对象Comparator就会被调用,并且您需要处理内部null引用。

在你的情况下,你可以使用类似的东西:

items.sort(
  Comparator.nullsFirst(
    Comparator.comparing(Item::getUser,
      Comparator.nullsFirst(Comparator.comparingDouble(User::getValue))
    )
  )
);
Run Code Online (Sandbox Code Playgroud)

(假设getValue()返回 a double

但我不太推荐这么复杂的代码。