简化 if, else-if, else with Java optional
Simplifying if, else-if, else with Java optional
我有一个方法接受 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 模式来简化这个?如果它只是我能想到的方法,但由于工作也是可选的,我不确定如何使用它。任何重构此代码的建议将不胜感激。
创建构建器对象并使用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
)。
我有一个方法接受 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 模式来简化这个?如果它只是我能想到的方法,但由于工作也是可选的,我不确定如何使用它。任何重构此代码的建议将不胜感激。
创建构建器对象并使用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
)。