java - 使用 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 我可以想办法,但由于工作也是可选的,我不知道如何使用它。任何重构此代码的建议将不胜感激。
解决方案
创建一个构建器对象并使用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
)。
推荐阅读
- github - 如何使用 github-pages 在 github 上托管 express 页面?
- java - OneSignal 重复推送通知
- java - 如何在java中打印领结?
- bash - bash中的'while'循环:不理解行为
- c# - Razor.NET 上的导航问题
- ffmpeg - ffmpeg:在 android 上播放视频的问题
- c# - 如何从 log4net 切换到 Microsoft.Extensions.Logging 多个库
- angular - 导入谷歌地图 LatLngBounds
- javascript - 使用 Django 预览图像
- c# - Linq - 获取一个列表并按字符串值列表对其进行排序