You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:22:48