Long和Integer使用equals比较数值问题

今天查出数据时,然后想通过stream的filter过滤出数据,使用的条件是Long.equals(Integer),
然后发现一直是false,然后打印测试了一下

List<ContractExpensesEditVo.ContractExpensesDetail> basicList = contractExpensesDetail
    .stream().filter(obj ->{
            System.out.println("Long.equals(Integer):"+obj.getFirstSubjectId().equals(ContractApiCode.BASIC_FEE.getCode()));
            System.out.println("Integer.equals(Long):"+ContractApiCode.BASIC_FEE.getCode().equals(obj.getFirstSubjectId()));
            System.out.println(obj.getFirstSubjectId().longValue()==ContractApiCode.BASIC_FEE.getCode());
           return obj.getFirstSubjectId().longValue()==ContractApiCode.BASIC_FEE.getCode();
        } )
    .collect(Collectors.toList());

结果:

在这里插入图片描述

按理说equals比较的是值,应该是true的,但是打印出来的是false,
查了资料才发现Long和Integer的类都重写了equals方法如下:

//Long
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

//Integer
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

他们的equals方法都会先判断类型然后再比较,类型不同直接返回false

后来改了写法:

1.obj.getFirstSubjectId().longValue() == ContractApiCode.CUSTOMS_FEE.getCode()
2.ContractApiCode.BASIC_FEE.getCode().equals(obj.getFirstSubjectId().longValue())

1.这么写就变成了long==Integer,Integer会进行拆箱转为int类型,然后向上转型为long类型,也就是变为了long==long ,这样就可以比较了


版权声明:本文为qq_42665745原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。