Sandeep Tiwari:
Eu estou usando rxJava primeira vez na minha aplicação eu estou tentando alcançar seguinte aplicação:
- buscar conta do servidor 3rd party
- buscar conta da DB locais
- comparar conta e filtrar aqueles conta que não está em DB locais
- salvar apenas as contas em db local que não está na DB local.
Aqui está o meu código: -
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
}
Qualquer ajuda é apreciada.
Ravindra Ranwala:
Você pode fazê-lo como tal,
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());
}
Atualizar
A 2ª chamada para save
retornos uma Observable<?>
(apenas uma suposição) e quando ele é envolto em um map
operador retorna Observable<Observable<?>>
. Mas o que você precisa como um valor de retorno é Observable<?>
. Então você precisa para achatar a Observable<Observable<?>>
em Observable<?>
E é aí que flatMap
é usado. Aqui está a resposta atualizada no caso, se necessário.
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())));
}