我试图理解Optional<T>.orElse()和Optional<T>.orElseGet()方法之间的区别.
该orElse()方法的描述是"如果存在则返回值,否则返回其他值".
虽然,该orElseGet()方法的描述是"如果存在则返回值,否则调用other并返回该调用的结果".
该orElseGet()方法采用供应商功能接口,基本上不接受任何参数和返回T.
你需要在哪种情况下使用orElseGet()?如果你有一个方法,你T myDefault()为什么不这样做optional.orElse(myDefault())而不是optional.orElseGet(() -> myDefault())?
似乎没有orElseGet()将lambda表达式的执行推迟到以后的某个时间或什么的,所以有什么意义呢?(我本以为如果它返回一个更安全Optional<T>的东西会更有用,它get()永远不会抛出一个NoSuchElementException并且isPresent()总是返回真实......但显然它不是,它只是返回T就像orElse()).
我还缺少其他一些差异吗?
仅当传入的用户对象不存在于数据库中时才尝试保留用户。该服务通过调用用户存储库中的 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)