【发布时间】: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