Как вернуть Observable от подписчика? - PullRequest
0 голосов
/ 04 октября 2018

Я впервые использую rxJava в своем приложении. Я пытаюсь добиться следующей реализации:

  1. получить учетную запись со стороннего сервера
  2. получить учетную запись из локальной БД
  3. сравнить учетную запись и отфильтровать учетную запись, которая не находится в локальной БД
  4. сохранить только те учетные записи в локальной БД, которая не находится в локальной БД.

Вот мой код: -

 private Observable<List<Result<Account, IError>>> filterAccounts(Context context, List<Account> accounts){


         accountDAL.getByIds(context, accounts
                .stream()
                .map(a -> Long.valueOf(a.getAccountId()))
                .collect(Collectors.toList()))//return Observable<List<T>> getByIds(Context context, List<Long> ids)
                .map( a -> {
                    Map<Long, SearchConnectAccount> map = a.stream()
                            .collect(Collectors.toMap(a -> a.getId(), Function.identity())); // map ==> {id = Account}

                 return map;
                }).subscribe( seMap -> { // subscribe observable

                  List<Account> filteredList = accounts.stream()
                             .filter(a -> seMap.get(Long.valueOf(a.getAccountId())) == null)
                             .collect(Collectors.toList());

Observable<List<Result<Account, IError>>> o = accountDAL.save(context, filteredList).first();
                    return o;//accountDAL.save(context, filteredList).first();

         });

        // how to return Observable<List<Result<Account, IError>>> from here
    }

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете сделать это следующим образом:

private Observable<List<Result<Account, IError>>> filterAccounts(Context context, List<Account> accounts){
     return accountDAL.getByIds(context, accounts
            .stream()
            .map(a -> Long.valueOf(a.getAccountId()))
            .collect(Collectors.toList()))
            .map(a -> 
                 a.stream()
                        .collect(Collectors.toMap(a -> a.getId(), Function.identity())) // map ==> {id = Account}

            ).map(seMap -> 
               accountDAL.save(context, accounts.stream()
                     .filter(a -> seMap.get(Long.valueOf(a.getAccountId())) == null)
                     .collect(Collectors.toList())).first());
}

Обновить

Второй вызов save возвращает Observable<?> (только предположение) икогда он заключен в оператор map, он возвращает Observable<Observable<?>>.Но в качестве возвращаемого значения вам нужно Observable<?>.Так что вам нужно выровнять Observable<Observable<?>> в Observable<?>, и именно здесь используется flatMap.Вот обновленный ответ в случае необходимости.

private Observable<List<Result<Account, IError>>> filterAccounts(Context context, List<Account> accounts) {
        return accountDAL
                .getByIds(context,
                        accounts.stream().map(a -> Long.valueOf(a.getAccountId())).collect(Collectors.toList()))
                .map(ar -> ar.stream().collect(Collectors.toMap(Account::getAccountId, Function.identity())) // map ==>
                                                                                                            // {id =
                // Account}

                ).flatMap(seMap -> accountDAL.save(context, accounts.stream()
                        .filter(a -> seMap.get(Long.valueOf(a.getAccountId())) == null).collect(Collectors.toList())));
    }
...