java - 发生异常时,可选的 orElse() 无法返回替代值

标签 java spring spring-boot spring-data-jpa option-type

我正在使用此逻辑并尝试在未找到员工时返回 new Employee()

但是,当 request.getId()null 时,它会抛出异常,我正在等待它执行 orElse() 部分.然而,事实并非如此。那么,我应该使用另一种可选方法吗? orElseGet() 还是 ifPresentOrElse()

我怎样才能巧妙地解决这个问题?

Employee employee = employeeRepository.findById(request.getId())
        .orElse(new Employee());

更新: 如果使用 Optional 不是一个好主意,我考虑使用以下方法:

Employee employee = new Employee();
if (id != null) {
    employee = employeeRepository.findById(id)
                   .orElse(new Employee());
}

有什么想法吗?

最佳答案

如评论中所述,Optional 在这种情况下不执行任何操作。要解决它,您需要自己处理 null 值。您可以通过让 request.getId() 自己返回一个 Optional 来做到这一点(因为它可以是 null)。

现在您可以使用 flatMap() 运算符链接这些 Optional

public class MyRequestClass {
    private Long id;

    // Change your getter to this, or make a new one, eg. 'getOptionalId()'
    public Optional<Long> getId() {
        return Optional.ofNullable(id);
    }
}

现在您可以将代码重构为:

Employee employee = request
    .getId()
    .flatMap(employeeRepository::findById) // Using flatMap() in stead of map()
    .orElseGet(Employee::new); // I changed this part so that new Employee() is 
                               // called lazily when no Employee was found in 
                               // the database (or when the request has no ID)

关于java - 发生异常时,可选的 orElse() 无法返回替代值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72626469/

相关文章:

java - Eclipse下自动从插件文件夹创建Jar

java - 在 Google App Engine 上使用 JavaMail 丢失电子邮件

java - LibGDX 在更新方法期间执行一次操作

java - 如何获取当前位置和下一个当前位置之间的距离

java - 如何将 Spring Cloud Config 与 Git 和 Vault 复合环境存储库一起使用?

java - 2 个配置文件,2 个方法实现,1 个通过 Thymeleaf 调用 html 文件。如何?

java - 使用 Spring @Retryable 和 Jackson json 反序列化

java - 运行 Spring Boot APP 时出现 Spring Boot 问题

java - SQL 性能 : Multiple Binds or Bind to One SQL Variable for Re-use?

java - Spring 启动: How to read external files reside in Tomcat when deployed as war