gpt4 book ai didi

java - 比较器:比较 2 个对象与可以为空的字段

转载 作者:行者123 更新时间:2023-11-29 10:09:15 25 4
gpt4 key购买 nike

我需要通过实现默认比较器的典型比较方法来编写一个比较器。这是由于我需要实现的接口(interface)而给出的。

我的对象是具有 Integer 字段 vintage 的产品,该字段可以是 null。代码如下:

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

if ( product1 == null && product2 == null )
{
return 0;
}
else if ( product1 == null && product2 != null )
{
return -1;
}
else if ( product1 != null && product2 == null )
{
return 1;
}

IProductData productData1 = (IProductData ) product1.getProvidedProductData();
IProductData productData2 = (IProductData ) product2.getProvidedProductData();

if ( productData1.getVintage() == null && productData2.getVintage() == null )
{
return 0;
}
else if ( productData1.getVintage() == null && productData2.getVintage() != null )
{
return -1;
}
else if ( productData1.getVintage() != null && productData2.getVintage() == null )
{
return 1;
}

return productData2.getVintage().compareTo( productData2.getVintage() );
}

我对此并不满意,因为我有很多重复的代码,而且我确信有更好的方法来做到这一点...任何建议都将不胜感激。

最佳答案

将您的 Comparator 包装在 Comparator.nullsFirst 中以避免处理可能的 null 参数。

你需要两个 ComparatorComparator#thenComparing 合并:

  1. nullsFirst(naturalOrder()) 首先比较 IProduct
  2. nullsFirst(comparing(p -> p...getVintage()) 然后比较他们的 Vintage

    Comparator<IProduct> comparator =
    nullsFirst(Comparator.<IProduct>naturalOrder())
    .thenComparing(nullsFirst(
    comparing(p -> p.getProvidedProductData().getVintage())
    )
    );

这种方法会自然地比较 IProduct,而您显然不想这样做。 (你根本没有比较它们)。

然后你可以写 IProduct p1, IProduct p2) -> 0 来继续比较 Vintage 在两个 IProduct 都不是

 Comparator<IProduct> comparator =
nullsFirst((IProduct p1, IProduct p2) -> 0)
.thenComparing(nullsFirst(
comparing(p -> p.getProvidedProductData().getVintage())
)
);

如果 getVintage 返回一个 int,您可以使用 Comparator.comparingInt 而不是 Comparator.comparing:

comparingInt(p -> p.getProvidedProductData().getVintage())

关于java - 比较器:比较 2 个对象与可以为空的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50022167/

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