2016-04-28 13 views
5

Ho una classe UserProfile contenente dati dell'utente come mostrato di seguito:conte campi non nulli in un oggetto

class UserProfile { 

    private String userId; 
    private String displayName; 
    private String loginId; 
    private String role; 
    private String orgId; 
    private String email; 
    private String contactNumber; 
    private Integer age; 
    private String address; 

// few more fields ... 

// getter and setter 
} 

devo contare non null campi per mostrare quanto percentuale del profilo è stato riempito dal utente. Inoltre ci sono pochi campi che non voglio considerare in calcolo percentuale come: userId, loginId e displayName.

modo semplice sarebbe quella di utilizzare più If dichiarazioni per ottenere il campo non nullo count ma comporterebbe sacco di codice piastra di caldaia e v'è un'altra classe Organization per cui ho bisogno di mostrare percentuale di completamento pure. Così ho creato una funzione di utilità come mostrato di seguito:

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

E poi io chiamo questa funzione come illustrato di seguito:

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

La mia domanda è, è questo il modo migliore che potevo contare non null campi o Potrei migliorare ulteriormente. Si prega di suggerire.

+0

Questa domanda sarebbe probabilmente più adatta per CodeReview, penso. Ma la tua soluzione non sembra male tbh. – Seth

+0

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

+0

Poiché si aggiungono le funzioni all'elenco, non è meglio che creare un metodo semplice in cui si controllano i campi uno di uno – AdamSkywalker

risposta

6

Si può semplicemente un sacco il codice con la creazione di un flusso sopra la lista data di funzioni:

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

Ciò restituirà il conteggio dei non null campi restituiti da ogni funzione. Ogni funzione viene mappata sul risultato dell'applicazione ad un dato oggetto e i campi null vengono filtrati con il predicato Objects::nonNull.

+2

@Tom Oh corretto, non l'ho notato e modificato. Grazie! – Tunaki

+2

@Tom: questo riflette solo l'incongruenza della domanda stessa, con "Contare campi null" nel titolo ma "contare campi non nulli" nel suo corpo. – Holger

+2

@ Holger Grazie per averlo indicato, ho aggiornato il titolo della domanda. –

Problemi correlati