java-8 - Comparator.nullsFirst 与空安全比较器

标签 java-8

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

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

items.sort(Comparator.nullsFirst(sort_high));

但是,如果 item.getUser().getValue() (或 item.getUser())为空,我会得到一个 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)

怎么了?

最佳答案

nullsFirst将处理 null Item s(“i1”),但是一旦找到两个有效对象,您的 Comparator被调用,您需要处理内部 null引用。

在您的情况下,您可以使用以下内容:

items.sort(
  Comparator.nullsFirst(
    Comparator.comparing(Item::getUser,
      Comparator.nullsFirst(Comparator.comparingDouble(User::getValue))
    )
  )
);

(假设 getValue() 返回 double )

但我几乎不推荐这种复杂的代码。

关于java-8 - Comparator.nullsFirst 与空安全比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925825/

相关文章:

java - 在 java 中收集 arraylist 的更快方法

java - 谁在把元素放入HashMap时调用了类的equals方法?

lambda - 关于 Java 8 中的功能接口(interface), "function shape"是什么?

Java 8 : Interface with static methods instead of static util class

java - 将字符串列表的所有元素转换为大写

java - 使用 Java 8 迭代时从列表对象中删除空间

java - 如何使用java Stream检查集合是否为空

java - OptionalInt 是否可重用?

java - ForkJoinPool 和 Future.Get

java - 如何在Junit 5中注册TestExecutionListener并检测是否所有测试都执行