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