2015-07-27 27 views
7

varsa bir alan döndüren veya kendisini çağıran aşağıdaki yöntemi düşünün beklendiği gibi çalışmıyor:Java 8'in OrElse alan bulunana kadar

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

bu işe yararken, ben kadar kısaltın düşündüm:

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

Ama garip bir şey .orElse kısmı buna denir gibi görünüyor olmasıdır.

Burada nelerin eksik?

+2

musunuz? – Holger

+0

@Holger Evet Biliyorum, kodu basitleştirmek için bunu bıraktım. – helpermethod

cevap

23

Bir yöntem için argümanlar, yöntem çağrılmadan önce her zaman değerlendirilir. Yalnızca Optional yoksa çağrılır bir Supplier aldığı orElseGet istiyorum: Eğer alan yoksa, bir noktada bir `null` üst sınıf vuracak farkında

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

Teşekkürler, tamamen getField Yöntemi yürütmeden önce çağrılacak cevapsız. – helpermethod

İlgili konular