Java 8的orElse无法正常工作

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

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

}

以上是 Java 8的orElse无法正常工作 的全部内容, 来源链接: utcz.com/qa/408446.html

回到顶部