不使用 isPresent 重写 Optional
Rewriting Optional without using isPresent
void spendTheNight() {
Optional<Homework> homework = getHomeworkDueTonight();
if (homework.isPresent()) {
rushThrough(homework.get());
} else {
homework = getHomeworkDueNextWeek();
if (homework.isPresent()) {
workSlowlyOn(homework.get());
} else {
partyHard();
}
}
goToBed();
}
我知道用 isPresent
做 if..else
是不好的做法;我怎样才能重写它以更好地利用 Optional
,使逻辑流程保持不变?
我正在考虑使用 or
、orElse
或 orElseGet
,但不确定如何在这里使用它们,在第一个 else
中进行附加分配.
(假设自定义方法无法修改且必须按原样使用)
你列出的所有APIor
、orElse
或orElseGet
return一个或另一个值,你的代码似乎更多围绕运行 基于 return 类型方法的某些条件的存根。
在这种情况下您可以使用 ifPresentOrElse
,因为 Java 9:
Optional<Homework> homework = getHomeworkDueTonight();
homework.ifPresentOrElse(this::rushThrough, () -> {
Optional<Homework> hw = getHomeworkDueNextWeek();
hw.ifPresentOrElse(this::workSlowlyOn, this::partyHard);
});
goToBed();
void spendTheNight() {
Optional<Homework> homework = getHomeworkDueTonight();
if (homework.isPresent()) {
rushThrough(homework.get());
} else {
homework = getHomeworkDueNextWeek();
if (homework.isPresent()) {
workSlowlyOn(homework.get());
} else {
partyHard();
}
}
goToBed();
}
我知道用 isPresent
做 if..else
是不好的做法;我怎样才能重写它以更好地利用 Optional
,使逻辑流程保持不变?
我正在考虑使用 or
、orElse
或 orElseGet
,但不确定如何在这里使用它们,在第一个 else
中进行附加分配.
(假设自定义方法无法修改且必须按原样使用)
你列出的所有APIor
、orElse
或orElseGet
return一个或另一个值,你的代码似乎更多围绕运行 基于 return 类型方法的某些条件的存根。
在这种情况下您可以使用 ifPresentOrElse
,因为 Java 9:
Optional<Homework> homework = getHomeworkDueTonight();
homework.ifPresentOrElse(this::rushThrough, () -> {
Optional<Homework> hw = getHomeworkDueNextWeek();
hw.ifPresentOrElse(this::workSlowlyOn, this::partyHard);
});
goToBed();