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

如何从Optional的ifPresentOrElse方法中获取返回值解决编译报错

核心报错原因

  • Optional.ifPresentOrElse() 是无返回值(void)的终端操作,无法将其执行结果赋值给VoteResponseDTO类型的变量,这是编译失败的直接原因。
  • 你需要在两个分支中分别拿到voteRepository.save()的返回结果,再统一转换为目标DTO类型。

修复方案

方案1:使用map + orElseGet 函数式写法

贴合Optional的设计思路,代码更简洁:

public VoteResponseDTO addVote(User user, VoteCreationDTO voteCreationDTO) {
    // 注意此处restaurant需从你的voteCreationDTO中获取,替换为项目实际取值逻辑
    Restaurant restaurant = getRestaurantFromDto(voteCreationDTO);
    
    Vote savedVote = voteRepository.findByUserIdAndVoteDate(user.getId(), LocalDate.now(clock))
            // 存在旧投票时,构造新投票对象继承旧ID
            .map(oldVote -> {
                Vote vote = new Vote(user, restaurant);
                vote.setId(oldVote.getId());
                return voteRepository.save(vote);
            })
            // 不存在旧投票时,直接保存新投票
            .orElseGet(() -> voteRepository.save(new Vote(user, restaurant)));
    
    // 将保存后的Vote实体转换为目标DTO,替换为项目实际的转换逻辑
    return convertToVoteResponseDTO(savedVote);
}

方案2:使用传统if-else判断,可读性更强

如果不偏好函数式写法,可使用最常见的判断逻辑实现:

public VoteResponseDTO addVote(User user, VoteCreationDTO voteCreationDTO) {
    Restaurant restaurant = getRestaurantFromDto(voteCreationDTO);
    Optional<Vote> oldVoteOpt = voteRepository.findByUserIdAndVoteDate(user.getId(), LocalDate.now(clock));
    Vote savedVote;
    
    if (oldVoteOpt.isPresent()) {
        Vote oldVote = oldVoteOpt.get();
        Vote vote = new Vote(user, restaurant);
        vote.setId(oldVote.getId());
        savedVote = voteRepository.save(vote);
    } else {
        savedVote = voteRepository.save(new Vote(user, restaurant));
    }
    
    return convertToVoteResponseDTO(savedVote);
}

注:上述代码中的getRestaurantFromDto、convertToVoteResponseDTO为示例方法,请替换为你项目中实际的参数获取、实体转DTO的业务逻辑。

内容的提问来源于stack exchange,提问作者user16722881

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:03