Java 8 的 orElse 未按预期工作

Java 8's orElse not working as expected

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

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

虽然这行得通,但我想我可以将其缩短为:

private Field getField(Class<?> clazz, String p) {
    return Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst()
            .orElse(getField(clazz.getSuperclass(), p));
}

但奇怪的是,.orElse部分似乎总是被调用。

我在这里错过了什么?

方法的参数总是在调用方法之前计算。你想要 orElseGet 它需要一个 Supplier ,只有当 Optional 不存在时才会被调用:

private Field getField(Class<?> clazz, String p) {
    return Arrays.stream(clazz.getDeclaredFields())
            .filter(f -> p.equals(f.getName()))
            .findFirst()
            .orElseGet(() -> getField(clazz.getSuperclass(), p));
}