有这样一个问题
public class Student {
private Long stuId;
private String name;
private Integer age;
// 省略getter、setter
}
public class StudentDaoImpl implements StudentDao {
// 模拟数据库操作
private List<Student> students;
public Student getStudent(Long stuId) {
System.out.println("根据UserId[" + stuId + "]获取学生信息");
List<Student> list = students.stream().filter(e -> e.getStuId() == stuId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(list)) {
return list.get(0);
}
return null;
}
}
这里怎么都获取不到Student对象,即使传过来的stuId是正确的依然如此。
后来,我把代码修改了一下就好了:
List<Student> list = students.stream().filter(e -> e.getStuId().equals(stuId)).collect(Collectors.toList());
// 或
List<Student> list = students.stream().filter(e -> e.getStuId() == stuId.longValue()).collect(Collectors.toList());
这里,尚未知道是什么原因。Java 基础类型应该会自动装箱拆箱才对呀。
也许是因为Lambda的缘故?
记录在此。
2018-09-20更新
出现这个问题的原因是:
- Java 基础类型的确会自动装箱拆箱,但是在这里是两个包装类之间的比较。
- 和Lambda无关。
- Long包装类之间的比较应该使用equals()方法
- 参考另一篇文章:包装类之equals