Java 8的orElse没有按预期工作
考虑以下方法,如果该字段存在,则返回该字段,或者在找到该字段之前递归调用自身:
private Field getField(Class clazz, String p) { Optional 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
,只有在Optional
不存在时才会调用Supplier
:
private Field getField(Class> clazz, String p) { return Arrays.stream(clazz.getDeclaredFields()) .filter(f -> p.equals(f.getName())) .findFirst() .orElseGet(() -> getField(clazz.getSuperclass(), p)); }