Как я могу сгруппировать события, испускаемые полем?

У меня есть пользователь класса:

class User {
  String companyId;
}

и класс Компания:

class Company {
    String id;
    List<User> users;
}

Мне нужно «сгруппировать» пользователей, созданных Observable<User> компанией, и вернуть Observable<Company>. У меня есть это:

public Observable<Company> getCompanies(Observable<User> users) {
    return users.distinct(new Func1<User, String>(){
        @Override
        public String call(User user) {
            return user.companyId;
        }
    }).map(new Func1<User, Company>(){
         @Override
         public Company call(User user) {
             return new Company(user.companyId);
         }
    });
}

Он работает, но он просто получает отдельных пользователей по идентификатору компании. Мне нужно установить List<User> каждой компании. Есть ли какой-нибудь оператор, который я могу использовать для решения этой проблемы?


person Héctor    schedule 23.01.2017    source источник


Ответы (1)


Решено! Есть оператор groupBy -.-"

public Observable<Company> getCompanies(Observable<User> users) {
    return users.groupBy(new Func1<User, String>(){
        @Override
        public String call(User user) {
            return user.companyId;
        }
    }).flatMap(new Func1<GroupedObservable<String, User>, Observable<List<User>>>() {
                @Override
                public Observable<List<User>> call(GroupedObservable<String, User> grouped) {
                    return grouped.toList();
                }
            }, new Func2<GroupedObservable<String, User>, List<User>, Company>() {
                @Override
                public Company call(GroupedObservable<String, User> grouped, List<User> users) {
                    return new Company(grouped.getKey(), users);
                }
            });
person Héctor    schedule 23.01.2017