Java 8';s orElse没有按预期工作
考虑以下方法,该方法返回字段(如果存在)或递归调用自身,直到找到该字段:Java 8';s orElse没有按预期工作,java,java-8,optional,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();
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);
}
私有字段getField(类clazz,字符串p){
可选字段=Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst();
返回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));
}
私有字段getField(类clazz,字符串p){
返回Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst()
.orElse(getField(clazz.getSuperclass(),p));
}
但奇怪的是,.orElse
部分似乎总是被调用
我在这里遗漏了什么?方法的参数总是在调用该方法之前进行求值。您需要
orElseGet
,它接受一个供应商
,只有在可选
不存在时才会调用该供应商:
private Field getField(Class<?> clazz, String p) {
return Arrays.stream(clazz.getDeclaredFields())
.filter(f -> p.equals(f.getName()))
.findFirst()
.orElseGet(() -> getField(clazz.getSuperclass(), p));
}
私有字段getField(类clazz,字符串p){
返回Arrays.stream(clazz.getDeclaredFields())
.filter(f->p.equals(f.getName()))
.findFirst()
.orElseGet(()->getField(clazz.getSuperclass(),p));
}
谢谢,完全没有注意到执行之前会调用getField方法。您是否知道,如果该字段不存在,您将在某个点上命中一个null
超类?@Holger是的,我知道,我只是省略了它以简化代码。