Как фильтровать повторяющиеся значения, испускаемые наблюдаемыми в RXJava?

У меня есть коллекция объектов, где я хочу подавить повторяющиеся элементы. Я знаю об операторе Distinct, но если я не ошибаюсь, он сравнивает элементы с помощью надлежащего переопределения метода hashcode. Но что, если мой хэш-код возвращает разные значения для одних и тех же объектов, и я хочу установить равенство самостоятельно. у разных есть 2 перегруженных метода - один без параметров и один с параметром Func1, я полагаю, что я должен использовать 2-й метод, но как exaccty?

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

Ответ 1

Да, вы правы, что вам нужно иметь согласованные методы equals() и hashcode() на вашем объекте, чтобы иметь возможность использовать distinct() потому что под обложками distinct оператор использует HashSet.

Версия, distinct от Func1 позволяет конвертировать объект в нечто, что вы хотите быть отличным (но должно реализовывать согласованные методы equals и hashcode).

Предположим, что у меня есть Observable<Person> где Person выглядит так:

class Person {
    String firstName;
    String lastName;
}

Затем, чтобы подсчитать количество различных первых имен, я мог бы это сделать:

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

Ответ 2

Не уверен, что простейший способ, но вы можете сделать это с уменьшением. Сокращение принимает коллекцию и действие. В рамках действия вы несете ответственность за добавление элементов в коллекцию самостоятельно. Там вы можете сделать любую логику, которая вам нужна, и условно добавить элементы в коллекцию.