gpt4 book ai didi

Java8 Null 安全比较

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:38 28 4
gpt4 key购买 nike

比较两种产品时遇到问题。我想比较它们每个的年份(可选)属性。但是只要此属性为 null,就会抛出 NPE。我想用 Comparator.nullsLast(..) 我可以处理空值......但似乎我对它的工作原理有误解,或者代码有问题。我需要更改什么才能使这项工作对 null 友好?

@Override
public int compare(IProduct product1, IProduct product2) throws ProductComparisonException {

Comparator<IShopProduct> comparator =
Comparator.nullsLast(Comparator.comparing(IShopProduct::getVintage));

return comparator.compare((IShopProduct)product1.getProvidedProductData(),
(IShopProduct)product2.getProvidedProductData());
}

提前致谢

最佳答案

应该是

Comparator<IShopProduct> comparator = 
Comparator.comparing( IShopProduct::getVintage,
Comparator.nullLast(naturalOrder()));

Comparator.nullFirst()/nullLast() 考虑 null 值大于/小于非 Null 对象

编辑

这是 Comparator.comparing() 的实现:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

如您所见,它会调用 keyExtractor.apply(c1).compareTo(),因此如果 keyExtractor.apply(c1)null,它将抛出 NPE

我建议使用以下函数的代码:

public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}

基本上它会提取值,然后将比较值传递给Comparator

这些值将被传递给解析为 value1.compareTo(value2)naturalOrder() 比较器。通常它会抛出 NPE,但我们用 Comparator.nullLast 包装了它,它有特殊的 null 处理程序。

关于Java8 Null 安全比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50215341/

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