2015-08-29 9 views
9

Ho una collezione di oggetti, dove voglio sopprimere gli elementi duplicati. Conosco l'operatore Distinct, ma se non sbaglio confronta gli articoli con il metodo hashcode correttamente sovrascritto. Ma cosa succede se il mio hashcode restituisce valori diversi per gli stessi oggetti, e voglio impostare l'uguaglianza per conto mio. distinti hanno 2 metodi sovraccaricati - uno senza param e uno con parametro Func1, suppongo che dovrei usare il 2o metodo, ma quanto esatto?Come filtrare i valori duplicati emessi da osservabili in RXJava?

.distinct(new Func1<ActivityManager.RunningServiceInfo, Object>() { 
         @Override 
         public Object call(ActivityManager.RunningServiceInfo runningServiceInfo) { 
          return null; 
         } 
        }) 

risposta

20

Sì hai ragione che è necessario disporre di consistenti equals() e hashcode() metodi su l'oggetto per essere in grado di utilizzare distinct() perché sotto le coperte l'operatore distinct utilizza un HashSet.

La versione di distinct con una Func1 consente di convertire l'oggetto in qualcosa che si desidera essere distinti (ma necessario implementare coerenti equals e hashcode metodi).

Supponiamo che io sono un Observable<Person> dove Person è come questo:

class Person { 
    String firstName; 
    String lastName; 
} 

Quindi per contare il numero di nomi distinti avrei potuto fare questo:

persons.distinct(person -> person.firstName).count(); 
0

Non so se il modo più semplice, ma è possibile farlo con ridurre. Riduci prende una raccolta e un'azione. All'interno dell'azione sei responsabile di aggiungere gli elementi alla raccolta da solo. Qui puoi fare qualsiasi logica desideri e aggiungere in modo condizionale elementi alla collezione.

Problemi correlati