Null Safe 比较两个具有 0.0 和 0 的 bigdecimal 对象
Null Safe Compare two bigdecimal objects having 0.0 and 0
最初的代码是:
if(!Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())){
log.info("Difference")
}
输出:
getApplicationItemCost: src:0.0| dest:0
Difference
ApplicationItemCost 是 BigDecimal 类型。
如果我使用 compareTo
,那么我必须明确检查空值,例如:
LOG.info("getApplicationItemCost: src:" + src.getApplicationItemCost() + "| dest:" + dest.getApplicationItemCost());
if((src.getApplicationItemCost()==null && dest.getApplicationItemCost()!=null)
|| (src.getApplicationItemCost()!=null && dest.getApplicationItemCost()==null)
|| !Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())
|| src.getApplicationItemCost().compareTo(dest.getApplicationItemCost())!=0 )
任何比较 0.0 和 0 的建议。为什么会有这种差异? (可能是数据库有 Number 字段,当转换为大十进制时它不显示 0.0?)
尝试使用
CompareToBuilder
class 由
提供
org.apache.commons.lang3
因为它可以进行 null 安全比较。示例代码为:
public static <T, U> int nullSafeComparison(T t, U u) {
return new CompareToBuilder().append(t, u).toComparison();
}
public static void main(String[] args) {
BigDecimal zero = BigDecimal.ZERO;
BigDecimal zeroPzero = new BigDecimal("0.0");
System.out.println( zero + " " + zeroPzero);
System.out.println(nullSafeComparison(zero, zeroPzero));
}
如果两个数字相同,它将 return 0,如果第一个大于第二个,结果将为 1,如果第一个小于第二个,则结果为 -1。
Custom BigDecimal null safe Comparison (without any exteranal library):
{
BigDecimal big1, big2;
big1 = new BigDecimal(0);
big2 = new BigDecimal(0.0);
int compareResult1 = compareTo(b1,null);
int compareResult2 = compareTo(null,b2);
}
public static <T extends Comparable<T>> int compareTo(final T c1, final T c2) {
final boolean f1, f2;
return (f1 = c1 == null) ^ (f2 = c2 == null) ? f1 ? -1 : 1 : f1 && f2 ? 0 : c1.compareTo(c2);
}
建立一个比较器:
Comparator<BigDecimal> c = Comparator.nullsFirst(Comparator.naturalOrder());
(或 nullsLast
,如果您只与零进行比较并不重要)。
然后:
if (c.compare(first, second) != 0) {
// ...
}
最初的代码是:
if(!Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())){
log.info("Difference")
}
输出:
getApplicationItemCost: src:0.0| dest:0
Difference
ApplicationItemCost 是 BigDecimal 类型。
如果我使用 compareTo
,那么我必须明确检查空值,例如:
LOG.info("getApplicationItemCost: src:" + src.getApplicationItemCost() + "| dest:" + dest.getApplicationItemCost());
if((src.getApplicationItemCost()==null && dest.getApplicationItemCost()!=null)
|| (src.getApplicationItemCost()!=null && dest.getApplicationItemCost()==null)
|| !Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())
|| src.getApplicationItemCost().compareTo(dest.getApplicationItemCost())!=0 )
任何比较 0.0 和 0 的建议。为什么会有这种差异? (可能是数据库有 Number 字段,当转换为大十进制时它不显示 0.0?)
尝试使用
CompareToBuilder
class 由
提供org.apache.commons.lang3
因为它可以进行 null 安全比较。示例代码为:
public static <T, U> int nullSafeComparison(T t, U u) {
return new CompareToBuilder().append(t, u).toComparison();
}
public static void main(String[] args) {
BigDecimal zero = BigDecimal.ZERO;
BigDecimal zeroPzero = new BigDecimal("0.0");
System.out.println( zero + " " + zeroPzero);
System.out.println(nullSafeComparison(zero, zeroPzero));
}
如果两个数字相同,它将 return 0,如果第一个大于第二个,结果将为 1,如果第一个小于第二个,则结果为 -1。
Custom BigDecimal null safe Comparison (without any exteranal library):
{
BigDecimal big1, big2;
big1 = new BigDecimal(0);
big2 = new BigDecimal(0.0);
int compareResult1 = compareTo(b1,null);
int compareResult2 = compareTo(null,b2);
}
public static <T extends Comparable<T>> int compareTo(final T c1, final T c2) {
final boolean f1, f2;
return (f1 = c1 == null) ^ (f2 = c2 == null) ? f1 ? -1 : 1 : f1 && f2 ? 0 : c1.compareTo(c2);
}
建立一个比较器:
Comparator<BigDecimal> c = Comparator.nullsFirst(Comparator.naturalOrder());
(或 nullsLast
,如果您只与零进行比较并不重要)。
然后:
if (c.compare(first, second) != 0) {
// ...
}