Xem xét các phương pháp sau đây trả về một lĩnh vực nếu nó tồn tại hoặc đệ quy gọi bản thân cho đến khi lĩnh vực này được tìm thấy:Java 8 của OrElse không làm việc như mong đợi
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);
}
Trong khi làm việc này, tôi nghĩ rằng tôi có thể rút ngắn nó để:
private Field getField(Class<?> clazz, String p) {
return Arrays.stream(clazz.getDeclaredFields())
.filter(f -> p.equals(f.getName()))
.findFirst()
.orElse(getField(clazz.getSuperclass(), p));
}
Nhưng điều lạ là phần .orElse
dường như luôn luôn được gọi.
tôi thiếu gì ở đây?
Bạn có biết rằng nếu trường không tồn tại, bạn sẽ đánh một 'lớp cha null' tại một số điểm? – Holger
@Holger Vâng, tôi biết, tôi đã bỏ qua điều đó để đơn giản hóa mã. – helpermethod