2015-07-27 21 views
7

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?

+2

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

+0

@Holger Vâng, tôi biết, tôi đã bỏ qua điều đó để đơn giản hóa mã. – helpermethod

Trả lời

23

Các đối số cho một phương pháp luôn được đánh giá trước khi phương thức được gọi. Bạn muốn orElseGet mà phải mất một Supplier đó sẽ chỉ được gọi nếu Optional là không có mặt:

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

Cảm ơn, hoàn toàn bỏ lỡ phương thức getField sẽ được gọi trước khi thực thi. – helpermethod

Các vấn đề liên quan