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

Spring boot Java 8 Optional.map.orElse正在执行orElse部分,spring-boot,java-8,optional,Spring Boot,Java 8,Optional,仅当传入的用户对象在数据库中不存在时,我才尝试持久化用户。 该服务通过在用户repo中调用findByEmail方法返回可选的。 在我的例子中,数据库中已经存在一个确切的用户,并且正确地返回了对象 但是,在我的控制器中,当我执行Optional.map(user).orElse(persistuser)时,将执行orElse部分 我的理解是,当Optional.map返回一个Optional并且用户存在时,orElse应该返回用户,而不是执行persistuser操作 请帮我解决这个问题 控制器

仅当传入的用户对象在数据库中不存在时,我才尝试持久化用户。 该服务通过在用户repo中调用findByEmail方法返回可选的。 在我的例子中,数据库中已经存在一个确切的用户,并且正确地返回了对象

但是,在我的控制器中,当我执行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");                                       
    }
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); 

}
@PostMapping(path=“/addUser”,consumes=MediaType.APPLICATION\u JSON\u VALUE,products=MediaType.APPLICATION\u JSON\u VALUE)
公共响应属性addUser(@RequestBody User){
user=userService.checkIfUserExsits(user.getEmail())
.map(usr->usr)
.orElse(userService.persistUser(user));
返回respHelpers.prepareSuccessResponse(用户,“已处理”);
}
服务:

@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); 

}
public可选checkIfUserExsits(字符串电子邮件){
Optional user=Optional.ofNullable(userRepo.findByEmail(email));
返回用户;
}
存储库:

@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); 

}
@存储库
公共接口UserRepo扩展了JpaRepository{
公共用户findByEmail(字符串电子邮件);
}
orElse()
是一个方法,当您调用该方法时,它的参数会在其主体执行之前得到评估。因此,始终执行
userService.persistUser(用户)

您应该使用
orElseGet

    user = userService.checkIfUserExsits(user.getEmail())
                      .map(usr -> usr)
                      .orElseGet(() -> userService.persistUser(user));
这样,lambda表达式的主体将仅在
Optional
为空时执行