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

sgc*_*sgc 1 java-8 spring-boot option-type

仅当传入的用户对象不存在于数据库中时才尝试保留用户。该服务通过调用用户存储库中的 findByEmail 方法返回一个Optional。就我而言,数据库中已经存在一个确切的用户,并且对象已正确返回。

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

我的理解是,当Optional.map返回Optional并且用户也存在时,那么orElse应该返回用户,而不是执行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");                                       
    }
Run Code Online (Sandbox Code Playgroud)

服务:

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

存储库:

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

    public User findByEmail(String email); 

}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

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

你应该使用orElseGet

    user = userService.checkIfUserExsits(user.getEmail())
                      .map(usr -> usr)
                      .orElseGet(() -> userService.persistUser(user));
Run Code Online (Sandbox Code Playgroud)

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