java - 多个选项,选择最佳?
问题描述
我有一个可以包含多个可选 ID 的类,该类将选择第一个可用的并将其返回给调用者。像下面这样的东西。
Optional<Phone> homePhone;
Optional<Phone> mobilePhone;
Optional<Phone> emergencyPhone;
Phone getBestPhone() {
return homePhone.map(p -> p)
.orElse(mobilePhone.map(p -> p)
.orElse(emergencyPhone.map(p -> p)
.orElseThrow(() -> new IllegalArgument("No valid phone")))));
}
我想使用诸如 map 和 orElse 之类的可选方法,但在这种情况下,它会导致嵌套过多。其他两个伪代码选项可能是。
Phone getBestPhone() {
homePhone.ifPresent(p -> { return p; });
mobilePhone.ifPresent(p -> { return p; });
emergencyPhone.ifPresent(p -> { return p; });
throw new IllegalArgument("...");
}
Phone getBestPhone() {
return FirstPresent(homePhone, mobilePhone, emergencyPhone);
}
有没有比我现有的方法更好的方法?我很想通过执行 vanilla isPresent() 检查来避免嵌套。
解决方案
IMO,firstPersent
方法似乎更具可读性和可扩展性。我们可以使用Stream#of(T...)
方法将这些 s 包装Optional
到一个流中,然后找到第一个存在。
import java.util.Optional;
import java.util.stream.Stream;
public class GetFirstPresent {
public static void main(String[] args) {
Optional<Phone> homePhone = Optional.empty();
Optional<Phone> mobilePhone = Optional.empty();
Optional<Phone> emergencyPhone = Optional.of(new Phone("e123"));
Phone phone = firstPresent(homePhone, mobilePhone, emergencyPhone);
System.out.println(phone.id);
try {
firstPresent(homePhone, mobilePhone);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
}
@SafeVarargs
private static Phone firstPresent(Optional<Phone>... phones) {
return Stream.of(phones).filter(Optional::isPresent)
.findFirst().map(Optional::get).orElseThrow(() -> {
return new IllegalArgumentException("No phone present");
});
}
private static class Phone {
public Phone(String id) {
super();
this.id = id;
}
private String id;
}
}
一个缺点是我们需要@SafeVarargs
抑制警告,根据Is it possible to solve the “A generic array of T is created for a varargs parameter”编译器警告?
推荐阅读
- c# - 无法查看 Xamarin.IOS 故事板
- php - 我怎样才能知道在 PHP 应用程序中调用了多少次以及在何处调用了一个函数?
- android - 从文本文件android中删除奇怪的行
- c++ - Qt WebEngine 可以在没有 xcbglintegrations 的情况下进行渲染
- ios - 在 iOS 中从 HTML 创建 PDF 时出现异常
- javascript - 从嵌套的 html 列表生成多维数组/对象
- python - git python 不能在两次提交之间显示日志?
- angular - 我的 Angular 应用程序中的 ts 脚本在 node_modules 中找不到模块
- html - 使用自定义动画使 Modal 变大
- python-3.x - 在 python Queue 中添加新元素正在将所有以前的值更改为最新值(实现所有以前的 StackOverflow 答案)