2016-04-28 19 views
5

オブジェクトにnull以外のフィールドをカウントユーザー。また、私が計算のパーセンテージで考慮したくないフィールドは、userId,loginIddisplayNameのようにいくつかあります。私は、ユーザーのデータが含まれている<code>UserProfile</code>クラスを持っている

簡単な方法は、null以外のフィールドcountを取得するために、複数のIfステートメントを使用することですが、それはボイラープレートコードの多くを伴うだろうし、私も完了した割合を表示する必要のある別のクラスOrganizationがあります。だから私は、以下のショーとしての効用関数を作成:

public static <T, U> int getNotNullFieldCount(T t, 
     List<Function<? super T, ? extends U>> functionList) { 
    int count = 0; 

    for (Function<? super T, ? extends U> function : functionList) { 
     count += Optional.of(t).map(obj -> function.apply(t) != null ? 1 : 0).get(); 
    } 

    return count; 
} 

そして、下図のように、私はこの関数を呼び出します。

List<Function<? super UserProfile, ? extends Object>> functionList = new ArrayList<>(); 
functionList.add(UserProfile::getAge); 
functionList.add(UserProfile::getAddress); 
functionList.add(UserProfile::getEmail); 
functionList.add(UserProfile::getContactNumber); 
System.out.println(getNotNullFieldCount(userProfile, functionList)); 

私の質問は、これは私がいないnullフィールドを数えることができる最善の方法ですか私はそれをさらに改善することができた。提案してください。

+0

この質問はおそらくCodeReviewの方が適していると思います。しかし、あなたのソリューションは悪く見えません。 – Seth

+0

http://stackoverflow.com/questions/17095628/loop-over-all-fields-in-a-java-class – lexicalscope

+0

リストに関数を追加するので、フィールドを1つチェックする簡単なメソッドを作成するよりも優れていません – AdamSkywalker

答えて

6

あなたは、単に多くの機能の特定のリスト上のストリームを作成することによって、あなたのコードができます。

public static <T> long getNonNullFieldCount(T t, List<Function<? super T, ?>> functionList) { 
    return functionList.stream().map(f -> f.apply(t)).filter(Objects::nonNull).count(); 
} 

これは、各関数から返される非nullフィールドの数を返します。各関数は、与えられたオブジェクトに適用された結果にマップされ、nullフィールドは述語Objects::nonNullで除外されます。

+2

@Tom Oh正しいと思いますが、私は気づいて編集しませんでした。ありがとう! – Tunaki

+2

@Tom:これは質問自体の矛盾を反映していますが、タイトルに "ヌルフィールドを数えますが"そのボディには "ヌルフィールドは数えません"という意味です。 – Holger

+2

@Holgerそれを指摘してくれてありがとう、私は質問のタイトルを更新しました。 –

関連する問題