web-dev-qa-db-fra.com

Comment filtrer les valeurs dupliquées émises par observable dans RXJava?

J'ai une collection d'objets, où je veux supprimer les éléments en double. Je sais à propos de Distinct operator, mais si je ne me trompe pas, comparez les éléments avec une méthode de hashcode correctement surchargée. Mais que se passe-t-il si mon hashcode renvoie des valeurs différentes pour les mêmes objets et que je veux définir l'égalité par moi-même? distinctes ont 2 méthodes surchargées - une sans paramètres et une avec Func1, je suppose que je devrais utiliser la 2ème méthode, mais comment exactement?

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

Oui, vous avez raison de dire que vous devez avoir des méthodes cohérentes equals() et hashcode() sur votre objet pour pouvoir utiliser distinct() car, sous la couverture, l'opérateur distinct utilise une HashSet.

La version de distinct avec un Func1 vous permet de convertir l'objet en quelque chose que vous voulez différencier (mais vous devez implémenter des méthodes cohérentes equals et hashcode). 

Supposons que j'ai un Observable<Person>Person est comme ceci:

class Person {
    String firstName;
    String lastName;
}

Ensuite, pour compter le nombre de prénoms distincts, je pourrais faire ceci:

persons.distinct(person -> person.firstName).count();
26
Dave Moten

Pas sûr que ce soit le moyen le plus simple, mais vous pouvez le faire avec réduire. Réduire prend une collection et une action. Dans l'action, vous êtes responsable de l'ajout des éléments à la collection vous-même. Vous pouvez y faire la logique de votre choix et ajouter conditionnellement des éléments à la collection. 

0
FriendlyMikhail