今天查出数据时,然后想通过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 ,这样就可以比较了
1821

被折叠的 条评论
为什么被折叠?



