Java 8 的 orElse 未按预期工作

2022-09-03 17:35:22

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

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

方法的参数始终在调用方法之前进行计算。您希望它采取 a,仅当 不存在时才调用:orElseGetSupplierOptional

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

答案 2

推荐