在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加载
当可选
不为空时,使用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.