2016-12-25 1 views
6

プロファイリングが豊富であるため、Javaコードはヌル可能オブジェクトのメソッド結果の出力で詰まっています。それは、このjava8メソッド参照を使用するNullcheckメソッドは可能ですか?

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

のように見えます

は、このための静的メソッドを記述することが可能ですか? (たとえば、このように見える):

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

どのような= Util.nvlのように見えますか?私は検索したgoogleをちょっと試してみましたが、結果はありませんでした。

これは動作しません:

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

コンパイラは私に語った: 非静的メソッドのgetName()は静的コンテキスト

答えて

8

あなたの署名が正しいことはできませんから参照することはできません。あなたのメソッドは最初の引数としてNamedObjectを取るようにしたいので(TはNamedObjectです)、Stringを返すようにしてください(今はTがStringです)。次の2つのジェネリック型パラメータを必要

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

アンさらに良い署名は、より多くの柔軟性が、

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

すばらしい答え、ありがとう! – Nachaz

+0

「nvl」操作ではありませんが、「getOrDefault」操作です。 –

5

あなたのメソッドのジェネリックが正しく定義されていないだろう。特定のタイプのオブジェクト(引数のためにT、または与えられた例ではNamedObject)を受け取るメソッドを作成しようとしていて、別のタイプのオブジェクトを返すメソッドを適用します(S、引数として優雅がで多少あるものの、Javaの8のOptionalは、(あなたはもっとエレガントな方法でこれを書くことを可能にすることを

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

注:、または与えられた例ではString)、またはデフォルトS値を渡されたオブジェクトがnullある場合閲覧者の目):

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

あなたは 'Optional.ofNullable()'を意味していますか? –

+1

@PatrickParkerはい。気づいてくれてありがとう! – Mureinik

+2

いい例。おそらくこの関数の良い名前は 'notationMapOrElse'です。これはその表記法の省略形であるためです。 –

関連する問題