首页 > 解决方案 > 使用 Java 可选简化 if、else-if、else

问题描述

我有一个接受 3 个参数的方法,所有这些参数都是可选的。该方法的实现如下。

public static Person getPerson(Optional<String> id, Optional<List> jobs, Optional<String> country) {
    Person p = null;
 
    if(id.isPresent() && jobs.isPresent()) {
      p = Person.builder.withName("Name").withId(id.get()).withJobs(jobs.get()).build();
    } else if (id.isPresent()) {
       p = Person.builder.withName("Name").withId(id.get()).build();
    } else {
       p = Person.builder.withName("Name").build();
    }
    return p;
}

有没有办法用 Optional.map.orElseGet 模式来简化这个?如果它只是 id 我可以想办法,但由于工作也是可选的,我不知道如何使用它。任何重构此代码的建议将不胜感激。

标签: javaif-statementjava-8refactoringoptional

解决方案


创建一个构建器对象并使用ifPresent和分配相应的字段。

PersonBuilder builder = Person.builder.withName("Name");

id.ifPresent(idValue -> builder.withId(idValue));
jobs.ifPresent(jobsValue -> builder.withJobs(jobsValue));

return builder.build();

正如 Michael 所建议的,您还可以将 lambda 表达式替换为方法引用 ( builder::withId, builder::withJobs)。


推荐阅读