博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Java123] 开源工具guava比较器链ComparisonChain (附加比较null空值的实现方法)
阅读量:5264 次
发布时间:2019-06-14

本文共 2173 字,大约阅读时间需要 7 分钟。

工作中遇到的很多Common的问题,可以优先用短时间调研查找下功能强大高效使用广泛的开源库,退而再考虑自己闷头开发一个适用的工具。

 

近期项目测试需要开发很多对象比较的操作,看到前面童鞋使用了guava的ComparisonChain,很是受启发,自己果然还是太小白。路漫漫,继续努力吧。

 

使用过程中遇到一个坑。

场景:待比较的数据中可能有null值比较的情况。

1 int result = ComparisonChain.start().compare(actualRecord.getSciId(),2                             expectedRecord.getSciId()).compare(actualRecord.getLegalName(),3                             expectedRecord.getLegalName()).compare(actualRecord.getLei(),4                             expectedRecord.getLei()).compare(actualRecord.getLeiSource(),5                             expectedRecord.getLeiSource()).result();

抛出异常:

java.lang.NullPointerException: null

at com.google.common.collect.ComparisonChain$1.compare(ComparisonChain.java:76) ~[guava-15.0.jar:na]

源码分析:

1 @Override public ComparisonChain compare(2         Comparable left, Comparable right) {3       return classify(left.compareTo(right));4     }

这里的left一旦为null时,就会抛出NullPointerException。

解决方案可参考:

源码里compare还有一个重载方法,允许left和right值为null,需要传递一个comparator函数:

1 @Override public 
ComparisonChain compare(2 @Nullable T left, @Nullable T right, Comparator
comparator) {3 return classify(comparator.compare(left, right));4 }

于是修改实现代码,使用3个参数的重载方法,传递一个默认的comparator即完美解决。

1 // for Nullable fields, using compare with a comparator (i.e. Ordering.allEqual() )2                     int result = ComparisonChain.start().compare(actualRecord.getSciId(),3                             expectedRecord.getSciId()).compare(actualRecord.getLegalName(),4                             expectedRecord.getLegalName()).compare(actualRecord.getLei(),5                             expectedRecord.getLei(),Ordering.allEqual()).compare(actualRecord.getLeiSource(),6                             expectedRecord.getLeiSource(),Ordering.allEqual()).result();

Verify actual EodSnapshot SCI records MATCH with expected: com.scb.ccp.shark.qatool.impl.dao.audit.pojo.EodSnapshotSCI@16dc5c9[fmId=400852983,sciId=11182108,legalName=MTIME HOLDINGS, LTD.,lei=<null>,leiSource=<null>,recordDatetime=2019-08-11 21:00:15.0,cptyId=79fafe32-07de-48d9-8b12-58af4764ee49]

 

转载于:https://www.cnblogs.com/cathygx/p/11334741.html

你可能感兴趣的文章
JUnit
查看>>
WPF文本框只允许输入数字[转]
查看>>
事务的四种隔离级别和七种传播行为
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
Denver Broncos nfl jersey authentic considering alot more
查看>>
HDU 3572 最大流
查看>>
Bootstrap基础
查看>>
Javascript: 从prototype漫谈到继承(1)
查看>>
POJ 3974 Palindrome | 马拉车模板
查看>>
oracle表关联update和表建立索引
查看>>
JVM运行内存分类
查看>>
【学习】博弈相关:Nim
查看>>
BZOJ4552 HEOI/TJOI2016 排序 线段树、二分答案
查看>>
13. 用Roberts、Sobel、Prewitt和Laplace算子对一幅灰度图像进行边缘检测。观察异同。...
查看>>
Web 安全入门-书籍及建议
查看>>
prim算法基础详解(无向赋权图的最小生成树MST)
查看>>
vijos1404 遭遇战
查看>>
Androidstudio创建项目jdk版本问题
查看>>
WCF 第五章 行为 实现事务(操作行为)
查看>>
WCF 第七章 寄宿 在一个IIS寄宿服务中开启ASMX特性
查看>>