Java 8';s orElse没有按预期工作

Java 8';s orElse没有按预期工作,java,java-8,optional,Java,Java 8,Optional,考虑以下方法,该方法返回字段(如果存在)或递归调用自身,直到找到该字段: private Field getField(Class<?> clazz, String p) { Optional<Field> field = Arrays.stream(clazz.getDeclaredFields()) .filter(f -> p.equals(f.getName())) .findFirst();

考虑以下方法,该方法返回字段(如果存在)或递归调用自身,直到找到该字段:

private Field getField(Class<?> clazz, String p) {
    Optional<Field> field = Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst();

    return field.isPresent() ? field.get() : getField(clazz.getSuperclass(), p);
}
私有字段getField(类clazz,字符串p){
可选字段=Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst();
返回field.isPresent()?field.get():getField(clazz.getSuperclass(),p);
}
虽然这样做有效,但我认为可以将其缩短为:

private Field getField(Class<?> clazz, String p) {
    return Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst()
            .orElse(getField(clazz.getSuperclass(), p));
}
私有字段getField(类clazz,字符串p){
返回Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst()
.orElse(getField(clazz.getSuperclass(),p));
}
但奇怪的是,
.orElse
部分似乎总是被调用


我在这里遗漏了什么?

方法的参数总是在调用该方法之前进行求值。您需要
orElseGet
,它接受一个
供应商
,只有在
可选
不存在时才会调用该供应商:

private Field getField(Class<?> clazz, String p) {
    return Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst()
            .orElseGet(() -> getField(clazz.getSuperclass(), p));
}
私有字段getField(类clazz,字符串p){
返回Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst()
.orElseGet(()->getField(clazz.getSuperclass(),p));
}

谢谢,完全没有注意到执行之前会调用getField方法。您是否知道,如果该字段不存在,您将在某个点上命中一个
null
超类?@Holger是的,我知道,我只是省略了它以简化代码。