gpt4 book ai didi

java - Comparator.nullsFirst 在两者都为 null 时的工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:17 27 4
gpt4 key购买 nike

我有一个包含多个“可选”(不是 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 比较器可能是空安全的。

我做错了什么?

最佳答案

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

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

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

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

关于java - Comparator.nullsFirst 在两者都为 null 时的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44152312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com