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();