如何从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
相关产品推荐
相关产品推荐

