2015-07-27 24 views
7

Si consideri il seguente metodo che restituisce un campo se esiste o ricorsivamente chiama se stessa fino a quando il campo si trova:Java 8 OrElse non funziona come previsto

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

Anche se questo funziona, ho pensato che avrei potuto accorciare a:

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

Ma la cosa strana è che la parte .orElse sembra essere sempre chiamato.

Cosa mi manca qui?

+2

Sei consapevole che se il campo non esiste, vi ha colpito una 'superclasse null' ad un certo punto? – Holger

+0

@Holger Sì, lo so, l'ho appena lasciato fuori per semplificare il codice. – helpermethod

risposta

23

Gli argomenti per un metodo vengono sempre valutati prima di chiamare il metodo. Si vuole orElseGet che prende un Supplier che verrà richiamato solo se il Optional non è presente:

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

Grazie, assolutamente mancato che il metodo getField venga chiamato prima dell'esecuzione. – helpermethod

Problemi correlati