Java 8的orElse没有按预期工作

时间:2015-07-27 15:35:49

标签: 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();

    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部分似乎总是被召唤。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:29)

在调用方法之前,始终会评估方法的参数。如果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));
}