2016-12-25 19 views
6

Zengin profil oluşturma nedeniyle, Java kodumuz, nullable nesnelerin yöntem sonuçlarının çıktılarıyla karıştırılır.java8 yöntem referansı kullanılarak Nullcheck yöntemi mümkün mü?

Bunun için statik bir yöntem yazmak için bu

namedObject == null ? "?" : namedObject.getName() 

gibi mümkün olduğu görünüyor? (örneğin, bu gibi):

Util.nvl(namedObject, NamedObject::getName, "?") 

= Ne kullanacaksınız? Biraz aranan bir google denedim, ancak sonuç vermedi.

Bu işe yaramazsa:

public static <T> T nvl(T value, Function<T, ?> method, T nullSubstition) { 
    return value == null ? nullSubstition : (T) method.apply(value); 
} 

derleyici bana söyler: statik olmayan yöntem getName() statik bir bağlamda

cevap

8

İmzanız doğru olamaz başvurulan edilemez. Yönteminizin, ilk argüman olarak NamedObject (bu yüzden T bir NamedObject) olarak almasını ve bir String (yani şimdi T String) döndürmesini istiyorsunuz. Kişisel yöntemin jenerik doğru tanımlanmamış

public static <O, T> T nvl(O value, Function<? super O, ? extends T> method, T nullSubstition) { 
    return value == null ? nullSubstition : method.apply(value); 
} 
+1

Mükemmel cevap, çok teşekkürler! – Nachaz

+0

"nvl" işlemi değil, "getOrDefault" işlemi var. –

5

olurdu daha fazla esneklik sağlayan,

public class Utils { 

    public static <O, T> T nvl(O value, Function<O, T> method, T nullSubstition) { 
     return value == null ? nullSubstition : method.apply(value); 
    } 

    static class NamedObject { 
     String getName() { 
      return "foo"; 
     } 
    } 

    public static void main(String[] args) { 
     NamedObject foo = null; 
     String name = Utils.nvl(foo, NamedObject::getName, "bar"); 
     System.out.println("name = " + name); // name = bar 

     foo = new NamedObject(); 
     name = Utils.nvl(foo, NamedObject::getName, "bar"); 
     System.out.println("name = " + name); // name = foo 
    } 
} 

Daha iyi bir imza:

İki genel tür parametre gerekir. Belirli bir nesneyi ( T, argüman için aşk veya NamedObject verilen örnekte) alan bir yöntem oluşturmaya çalışıyorsunuz ve farklı türden bir nesneyi döndüren bir yöntem uygular ( S, argümanın iyiliği için) zerafet biraz olmasına rağmen, Java 8'in Optional (eğer daha şık bir şekilde bunu yazmak için izin olabilir

public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) { 
    return value == null ? nullSubstition : (S) method.apply(value); 
} 

Not: ya verilen örnekte String) veya varsayılan bir S değeri geçirilmesi nesne null ise Beyan edicinin gözü):

public static <T, S> S nvl(T value, Function<T, S> method, S nullSubstition) { 
    return Optional.ofNullable(value).map(method).orElse(nullSubstition); 
} 
+1

"İsteğe Bağlı", "İsteğe Bağlı()" anlamına mı geliyor? –

+1

@PatrickParker evet. Kendim orada var :-) Düzenlenmiş ve sabit, fark ettiğiniz için teşekkürler! – Mureinik

+2

güzel örnek. belki bu işlev için iyi bir isim, '' optionMapOrElse' olacaktır, çünkü bu gösterim için kısaltılmıştır. –

İlgili konular