【问题标题】:Java 8 Optional.map.orElse is performing the orElse part [duplicate]Java 8 Optional.map.orElse 正在执行 orElse 部分[重复]
【发布时间】:2020-07-15 08:01:29
【问题描述】:

只有当传入的用户对象在数据库中不存在时,我才会尝试持久化用户。 该服务通过调用用户存储库中的 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");                                       
    }

服务:

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

}

【问题讨论】:

    标签: spring-boot java-8 optional


    【解决方案1】:

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

    你应该使用orElseGet:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多