• [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]

  • 相关阅读:
    S MVC 转发与重定向
    S MVC Controller方法返回值
    S MVC 表单提交
    numpy数据平滑
    Python入门
    Django
    python机器学习基础教程-监督学习
    drf-CBV
    numpy数组符号化与函数向量化
    numpy中多项式拟合与复数
  • 原文地址:https://www.cnblogs.com/cathygx/p/11334741.html
Copyright © 2020-2023  润新知