Как фильтровать повторяющиеся значения, испускаемые наблюдаемыми в 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
Не уверен, что простейший способ, но вы можете сделать это с уменьшением. Сокращение принимает коллекцию и действие. В рамках действия вы несете ответственность за добавление элементов в коллекцию самостоятельно. Там вы можете сделать любую логику, которая вам нужна, и условно добавить элементы в коллекцию.