Java 不使用isPresent重写可选 void spendTheNight(){ 可选家庭作业=GetHomeWorkpueTownight(); if(家庭作业.isPresent()){ 快速完成(家庭作业,get()); }否则{ 家庭作业=GetHomeWorkbenextWeek(); if(家庭作业.isPresent()){ worklowlyon(家庭作业.get()); }否则{ partyHard(); } } goToBed(); }
我知道用Java 不使用isPresent重写可选 void spendTheNight(){ 可选家庭作业=GetHomeWorkpueTownight(); if(家庭作业.isPresent()){ 快速完成(家庭作业,get()); }否则{ 家庭作业=GetHomeWorkbenextWeek(); if(家庭作业.isPresent()){ worklowlyon(家庭作业.get()); }否则{ partyHard(); } } goToBed(); },java,optional,Java,Optional,我知道用isPresent做if..else是不好的做法;我如何重写它以更好地使用可选,从而使逻辑流保持不变 我正在考虑使用或,或orElse,或或orElseGet,但不确定如何在这里使用它们,在第一个或中有额外的赋值 (假设自定义方法无法修改,必须按原样使用)您列出的所有API或,或orElse,或或orElseGet返回一个或另一个值,您的代码似乎更倾向于基于方法返回类型的某些条件运行存根 在这种情况下,您可以使用ifpresentorese,因为Java 9: void spendThe
isPresent
做if..else
是不好的做法;我如何重写它以更好地使用可选,从而使逻辑流保持不变
我正在考虑使用或,或orElse
,或或orElseGet
,但不确定如何在这里使用它们,在第一个或中有额外的赋值
(假设自定义方法无法修改,必须按原样使用)您列出的所有API或,或orElse
,或或orElseGet
返回一个或另一个值,您的代码似乎更倾向于基于方法返回类型的某些条件运行存根
在这种情况下,您可以使用ifpresentorese
,因为Java 9:
void spendTheNight() {
Optional<Homework> homework = getHomeworkDueTonight();
if (homework.isPresent()) {
rushThrough(homework.get());
} else {
homework = getHomeworkDueNextWeek();
if (homework.isPresent()) {
workSlowlyOn(homework.get());
} else {
partyHard();
}
}
goToBed();
}
可选作业=GetHomeWorkdueTownight();
家庭作业.ifpresentorese(this::rushThrough,()->{
可选hw=GetHomeWorkbenextWeek();
hw.ifpresentorese(this::workSlowlyOn,this::partyHard);
});
goToBed();
你认为这是不好的做法为什么?@user207421那么你是说上面的代码是可以接受的/不坏的?它破坏了使用可选的
的意义,因为你可能还需要检查==null
中的值是否包装好,现在回答我的问题:)我认为在你的情况下,你不能谈论不好的做法。Naman的回答是另一种选择,但它做的事情与你用更经典的方式写的几乎相同。此处可选的主要目的是确保getHomeWorkpueTownight()
遵守合同。约定是,当您调用此方法时,它将返回一个可选的
。可选选项强制您检查是否有家庭作业。对于家庭作业
或null
备选方案,当没有家庭作业-->与团队合作时NPE的主要原因时,此方法是否会返回null并不明显。
Optional<Homework> homework = getHomeworkDueTonight();
homework.ifPresentOrElse(this::rushThrough, () -> {
Optional<Homework> hw = getHomeworkDueNextWeek();
hw.ifPresentOrElse(this::workSlowlyOn, this::partyHard);
});
goToBed();