如何实现Optional<Long>与Long类型的比较?城市ID比较代码优化求助
解决Optional与Long的城市ID比较问题
嘿,我来帮你梳理下这段代码的问题,然后给出更合理的实现方式~
原代码的核心问题
你当前的代码里,postService.findById(...).map(...) 返回的是 Optional<Long>,但你拿一个 Long 类型的 user 和它做 equals 比较——这就相当于拿一个数字和装着数字的盒子比,肯定不会相等,类型都不一样嘛!而且整个链式调用的逻辑绕来绕去,可读性很差,后续维护也容易踩坑。
正确的实现思路
我们需要先分别拿到两个城市ID的 Optional<Long> 对象,再判断它们是否同时存在且值相等。下面给你几种靠谱的实现方式:
方式一:分步写法(最清晰,推荐)
把获取两个ID的逻辑拆分开,一目了然,出问题也好排查:
public boolean isEqual(Comment comment) { // 获取评论所属用户的城市ID Optional<Long> commentUserCityId = userService.findById(comment.getUser().getId()) .map(user -> user.getCity().getId()); // 获取帖子所属用户的城市ID Optional<Long> postUserCityId = postService.findById(comment.getPost().getId()) .map(post -> post.getUser().getCity().getId()); // 只有两个ID都存在且值相等时,返回true return commentUserCityId.isPresent() && postUserCityId.isPresent() && commentUserCityId.get().equals(postUserCityId.get()); }
方式二:利用Optional的equals方法
Optional 类的 equals 方法本身就会判断:如果两个Optional都有值,就比较值是否相等;如果都为空,也会返回true。如果你能接受“两个都没有城市ID”也算相等的场景,可以用这种更简洁的写法:
public boolean isEqual(Comment comment) { Optional<Long> commentUserCityId = userService.findById(comment.getUser().getId()) .map(user -> user.getCity().getId()); Optional<Long> postUserCityId = postService.findById(comment.getPost().getId()) .map(post -> post.getUser().getCity().getId()); return commentUserCityId.equals(postUserCityId); }
方式三:链式调用写法(适合喜欢流式风格的场景)
如果偏爱链式调用,可以用 flatMap 来串联逻辑,最后用 orElse(false) 处理空的情况:
public boolean isEqual(Comment comment) { return userService.findById(comment.getUser().getId()) .map(user -> user.getCity().getId()) // 拿到评论用户城市ID后,去匹配帖子用户的城市ID是否相等 .flatMap(commentCityId -> postService.findById(comment.getPost().getId()) .map(post -> post.getUser().getCity().getId().equals(commentCityId))) // 只要中间任何一步为空,就返回false .orElse(false); }
小提醒
如果你的业务逻辑里,“其中一个没有城市ID”绝对不能算相等,那优先选方式一;如果能接受两个都为空的场景,方式二更简洁。
内容的提问来源于stack exchange,提问作者fat_pikachu
相关产品推荐
相关产品推荐

