Java 8 Optional.map.orElse 正在执行 orElse 部分

Java 8 Optional.map.orElse is performing the orElse part

仅当传入的用户对象不存在于数据库中时,我才尝试保留用户。 通过调用用户存储库中的 findByEmail 方法,服务 return 是可选的。 在我的例子中,数据库中已经存在一个确切的用户并且对象 returned 正确。

但是,在我的控制器中,当我执行 Optional.map(user).orElse(persistuser) 时,会执行 orElse 部分。

我的理解是,当 Optional.map return 是一个 Optional 并且用户存在时,orElse 应该 return 用户,而不是执行 persistuser 操作。

请帮我解决这个问题。

控制器:

@PostMapping(path = "/addUser", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Response> addUser(@RequestBody User user){
        
        user = userService.checkIfUserExsits(user.getEmail())
                          .map(usr -> usr)
                          .orElse(userService.persistUser(user));
        
        return respHelpers.prepareSuccessResponse(user,"Processed");                                       
    }

服务:

public Optional<User> checkIfUserExsits(String email){      
    Optional<User> user = Optional.ofNullable(userRepo.findByEmail(email));     
    return user;
}

存储库:

@Repository
public interface UserRepo extends JpaRepository<User, UUID> {

    public User findByEmail(String email); 

}

orElse() 是一种方法,当您调用该方法时,它的参数会在执行主体之前进行评估。因此 userService.persistUser(user) 总是被执行。

你应该使用 orElseGet:

    user = userService.checkIfUserExsits(user.getEmail())
                      .map(usr -> usr)
                      .orElseGet(() -> userService.persistUser(user));

这样,只有当 Optional 为空时,lambda 表达式的主体才会被执行。