当前位置: 首页 > 知识库问答 >
问题:

orElse的Java可选工作与其他

古明煦
2023-03-14

在Optional while Optional.orElse方法被调用时,无论元素是否存在,都不执行orElse部分,它的行为不像if else条件那样。

在下面的代码中,如果您在案例1中看到getNullPoJo和getDefaultPoJo都被执行,因为getNullPoJo将返回空的可选的

public static void main (String [] a) {
    PoJo poJo1=getNullPoJo().orElse(getDefaultPoJo());//Case 1
    System.out.println("pojo1 Got "+poJo1.getVariable());
    PoJo poJo2=getLoadedPoJo().orElse(getDefaultPoJo());//Case 2
    System.out.println("pojo2 Got "+poJo2.getVariable());
}

private static Optional<PoJo> getNullPoJo() {
    System.out.println("Executing getNullPoJo");
    Optional<PoJo> optional=Optional.empty();
    return optional;
}

private static Optional<PoJo> getLoadedPoJo() {
    System.out.println("Executing getLoadedPoJo");
    PoJo poJo =new PoJo();
    poJo.setVariable("Loaded");
    Optional<PoJo> optional=Optional.of(poJo);
    return optional;
}

private static PoJo getDefaultPoJo() {
    System.out.println("Executing getDefaultPoJo");
    PoJo poJo =new PoJo();
    poJo.setVariable("Default");
    return poJo;
}

当前输出为:

正在执行getNullPoJo

执行getDefaultPoJo

pojo1获得默认值

正在执行getLoadedPoJo

执行getDefaultPoJo

pojo1获得默认值

正在执行getLoadedPoJo

pojo2加载

共有1个答案

胥康安
2023-03-14

可选不为空时,使用orelseget()避免计算getDefaultPOJO():

PoJo poJo1=getNullPoJo().orElseGet(() -> getDefaultPoJo());
PoJo poJo2=getLoadedPoJo().orElseGet(() -> getDefaultPoJo());
 类似资料:
  • 我一直在使用Java 8中的新的可选类型,我遇到了一个似乎不受功能支持的常见操作:“orelseoptional” 请考虑以下模式: 这种模式有很多种形式,但归结起来就是在一个可选项上需要一个“orelse”,该“orelse”接受一个函数,生成一个新的可选项,只有当当前的可选项不存在时才调用。 它的实现如下所示: 我很好奇这样一种方法不存在的原因,如果我只是在一种无意的方式下使用Optional

  • 为什么这段代码会抛出异常?为什么它还要去“奥雷尔斯”分店? 这是因为某种怪异的处决令吗?那么在计算orElse分支之前没有设置第一个可选项的值?

  • 问题内容: 考虑以下方法,该方法将返回一个字段(如果存在)或递归调用自身直到找到该字段: 虽然这可行,但我想可以将其缩短为: 但是奇怪的是,该部分似乎总是被调用。 我在这里想念什么? 问题答案: 方法的参数始终在调用方法之前进行求值。您想要带一个仅在不存在时才被调用的:

  • 问题内容: 所以我正在与Optionals一起工作,并且遇到了一种奇怪的行为。我想知道这是否真的是意向性的“功能”或其他…奇特的… 这是给定的示例:我有一个带有Optional的方法,在其中我要评估另一个Optional的方法。如果其他Optional不存在,我将引发IllegalArgumentException: 现在,如果the 为空的Optional,即使存在,它也会引发IllegalAr

  • 问题内容: Java中是否有一种优雅的流式处理方式,可以说“如果此Optional映射到具有计算值的另一个Optional,如果该值存在,则返回一个空的Optional”? 我想到了类似的东西: 但这是不可能的。 我想出的解决方案有些冗长,而不像流式: 问题答案: 您不需要以下子句:

  • 我有一个使用Thymeleaf的工作spring boot 2.3.0应用程序。 我有一个表单,它有一个,相应的表单数据对象的Java值为: 我的 有 。在实际应用中一切都运行良好。 但是,当运行一个HtmlUnit测试时,我得到: 字段“avatar file”上的对象“user”中的字段错误:拒绝值[];代码[TypeMismatch.user.AvatarFile,TypeMismatch.