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 ,这样就可以比较了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值