zoukankan      html  css  js  c++  java
  • [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]

  • 相关阅读:
    异常处理基本语法
    数字取舍(trunc round ceil floor)
    关于union的理解
    SQL Loader 导入EXCEL 数据到ORACLE 数据库
    临时表的使用方法
    对外投资
    存货盘盈盘亏核算
    现金流量表补充资料的编制公式
    会计科目的具体定义
    中英文职位对照之 会计与财务
  • 原文地址:https://www.cnblogs.com/cathygx/p/11334741.html
Copyright © 2011-2022 走看看