【问题标题】:Working of Comparator.nullsFirst when both are null当两者都为空时 Comparator.nullsFirst 的工作
【发布时间】:2017-05-24 07:56:01
【问题描述】:

我有一个包含几个“可选”(不是java.util.Optional)字段的类。我正在编写一个 Lambda 比较器,通过比较它们的属性子集来测试相等性

我写的

private final static Comparator<MyEntity> COMPARATOR_491 =  
            comparing(MyEntity::getIsin)
             .thenComparing(MyEntity::getTMarketType)
             .thenComparing(nullsFirst(comparing(MyEntity::getIsoCode)))
             .thenComparing(MyEntity::getTaxRate)
             .thenComparing(nullsFirst(comparing(MyEntity::getEndDate)));
  • ISIN 不为空
  • 市场类型不为空
  • 代码是否可以为空
  • 税率不为空
  • 结束日期可以为空

问题是我经常收到NullPointerException。这是(几乎不可读的)堆栈跟踪

java.lang.NullPointerException: null
    at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) ~[?:1.8.0_51]
    at java.util.Comparator$$Lambda$40/221702765.compare(Unknown Source) ~[?:?]
    at java.util.Comparators$NullComparator.compare(Comparators.java:83) ~[?:1.8.0_51]
    at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:217) ~[?:1.8.0_51]
    at java.util.Comparator$$Lambda$42/770739971.compare(Unknown Source) ~[?:?]
    at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216) ~[?:1.8.0_51]
    at java.util.Comparator$$Lambda$42/770739971.compare(Unknown Source) ~[?:?]
    at java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216) ~[?:1.8.0_51]
    at java.util.Comparator$$Lambda$42/770739971.compare(Unknown Source) ~[?:?]

我发现两个示例实体的结束日期不同。第一个实体有非空属性,第二个有空

我认为当一个或两个参数为空时,nullsFirst 比较器可能是空安全的。

我做错了什么?

【问题讨论】:

标签: java java-8 comparator


【解决方案1】:

nullsFirst(…) 返回的比较器返回一个比较器,它处理要比较的一个或两个对象是 null 的情况。

所以当你说nullsFirst(comparing(MyEntity::getIsoCode)) 时,你会得到一个比较器来处理MyEntity 实例中的一个或两个是null 的情况,并根据它们的自然顺序比较getIsoCode 属性(不处理null 值) , 如果MyEntity 实例都不是null

您想要实现的是comparing(MyEntity::getIsoCode, nullsFirst(naturalOrder())),指定null-safe 比较器用于比较属性值。这同样适用于 getEndDate 属性。

您可以将其与thenComparing 融合到previousComparator.thenComparing(MyEntity::getIsoCode, nullsFirst(naturalOrder()))

【讨论】:

  • 经过一番修改后,我自己得出了同样的结论,但我想奖励你接受的答案。我在第一次实现中混淆了 nullsFirst/last 的工作
猜你喜欢
  • 2021-09-26
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2021-05-26
  • 2020-01-26
相关资源
最近更新 更多