通过ID获取指定用户时报错,如何不使用Predicate实现单用户查询?
问题解决:修复/users/{id} 400错误并实现无Predicate的单用户查询
错误根源
你的400请求错误核心问题出在DataAccessObjectService的findOne方法里:
Predicate<? super UserInfo> predicate = user -> user.equals(id);
这里把UserInfo对象直接和int类型的id做相等判断——如果UserInfo没重写equals方法,默认的对象引用比较根本不会匹配到任何用户;即使重写了,这种跨类型的比较逻辑也不符合预期,最终触发异常导致400 Bad Request。
无Predicate的两种实现方式
方式1:传统循环遍历(直观易读)
直接遍历用户列表,逐个匹配id:
public UserInfo findOne(int id) { for (UserInfo user : users) { if (user.getId() == id) { return user; } } return null; }
方式2:Stream直接过滤(不单独定义Predicate)
如果想用Stream API但不想单独声明Predicate变量,可以直接在filter方法内写判断逻辑:
public UserInfo findOne(int id) { return users.stream() .filter(user -> user.getId() == id) .findFirst() .orElse(null); }
额外建议
建议给UserInfo类重写equals和hashCode方法(基于id字段),这样后续涉及对象比较的场景不会再出现逻辑错误,但当前场景下上面的两种实现已经能解决问题。
内容的提问来源于stack exchange,提问作者codelover
相关产品推荐
相关产品推荐

