[Java123] 开源工具guava比较器链ComparisonChain (附加比较null空值的实现方法)

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

https://baijiahao.baidu.com/s?id=1633041810241009976&wfr=spider&for=pc

 

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

https://www.cnblogs.com/fanguangdexiaoyuer/p/6252993.html

https://my.oschina.net/wwwd/blog/681254

 

使用过程中遇到一个坑。

场景:待比较的数据中可能有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。

解决方案可参考:

https://www.cnblogs.com/peida/p/3136042.html

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

1 @Override public <T> ComparisonChain compare(
2         @Nullable T left, @Nullable T right, Comparator<T> 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]

 

posted @ 2019-08-11 13:22  CathyGao2018  阅读(723)  评论(0编辑  收藏  举报