BigDecimal 的空安全比较器

问题描述 投票:0回答:3

我想要一个空安全比较器。但我试了很多方法还是不行。 **getBenefitLimit **是一个 **BigDecimal **值,在比较器中没有比较 BigDecimal 值。 这样的话怎么能算出这个...

我的代码和错误使用不带 null (Comparator.nullsFirst)

List<ProductBenefitResponse> list = new ArrayList<>(benefitMap.values());
list.sort(Comparator.comparing(ProductBenefitResponse::getDescription).thenComparing(ProductBenefitResponse::getBenefitLimit));

错误必须是:-

java.lang.NullPointerException: null
    at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
    at java.base/java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:217)
    at java.base/java.util.TimSort.binarySort(TimSort.java:296)
    at java.base/java.util.TimSort.sort(TimSort.java:239)
    at java.base/java.util.Arrays.sort(Arrays.java:1515)
    at java.base/java.util.ArrayList.sort(ArrayList.java:1750)

我的代码和错误使用 null (Comparator.nullsFirst)

List<ProductBenefitResponse> list = new ArrayList<>(benefitMap.values());
list.sort(Comparator.nullsFirst(
        Comparator.comparing(ProductBenefitResponse::getBenefitLimit)
                .thenComparing(ProductBenefitResponse::getDescription)
));

错误必须是:-

java.lang.NullPointerException: null
    at java.base/java.math.BigDecimal.compareTo(BigDecimal.java:3065)
    at java.base/java.math.BigDecimal.compareTo(BigDecimal.java:228)
    at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
    at java.base/java.util.Comparator.lambda$thenComparing$36697e65$1(Comparator.java:216)
    at java.base/java.util.Comparators$NullComparator.compare(Comparators.java:83)
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.base/java.util.TimSort.sort(TimSort.java:234)
    at java.base/java.util.Arrays.sort(Arrays.java:1515)
    at java.base/java.util.ArrayList.sort(ArrayList.java:1750)

这段代码有什么问题,请给我并回答...

java spring-boot
3个回答
2
投票

现在

nullsFirst
应用于
ProductBenefitResponse
对象,而不是
BigDecimal
值。

试试这个:

Comparator<BigDecimal> bigDecimalComparator = Comparator.nullsFirst(Comparator.naturalOrder());
list.sort(
    Comparator
        .comparing(ProductBenefitResponse::getDescription)
        .thenComparing(ProductBenefitResponse::getBenefitLimit, bigDecimalComparator)
);

通过为映射指定空安全比较器,它适用于映射的结果。


0
投票

我找到了简单的方法,这是正确的吗? 无论如何它都会返回我想要的值。

List<ProductBenefitResponse> list = new ArrayList<>
(benefitMap.values());list.sort(Comparator.comparing(ProductBenefitResponse::getDescription,Comparator.nullsLast(Comparator.naturalOrder()))
                    .thenComparing(ProductBenefitResponse::getBenefitLimit,Comparator.nullsLast(Comparator.naturalOrder())));

0
投票

我建议如下。它不仅适用于 BigDecimal,也适用于现代日期时间类型。

org.apache.commons.lang3.ObjectUtils.compare(a, b) == 0
© www.soinside.com 2019 - 2024. All rights reserved.