2016-03-19 8 views
0

erneut verknüpfen Ich habe eine Observable, die eine Liste von Position Objekte ausgibt. Diese Location-Objekte haben eine Methode getUser(), die einen User (wirklich !?) zurückgibt. Ich versuche, ein neues Observable zurückzugeben, das eine Liste von Benutzerobjekten mit dieser Liste von Location-Objekten ausgibt. Hier ist mein Code:Elemente nach dem Anwenden von Observable.from() in Rx Java

Standorte beobachtbare

private Observable<List<QBLocation>> retrieveLocations(){ 

    QBLocationRequestBuilder getLocationsBuilder = new QBLocationRequestBuilder(); 
    getLocationsBuilder.setPerPage(100); 
    getLocationsBuilder.setLastOnly(); 
    getLocationsBuilder.setCurrentPosition(mLastLocation.getLatitude(), mLastLocation.getLongitude()); 
    getLocationsBuilder.setSort(SortField.CREATED_AT); 
    getLocationsBuilder.setSort(SortField.DISTANCE, SortOrder.DESCENDING); 

    return Observable.create(subscriber -> { 

     Bundle mBundle = new Bundle(); 

     try { 

      ArrayList<QBLocation> qbLocations = QBLocations.getLocations(getLocationsBuilder, mBundle); 
      subscriber.onNext(qbLocations); 
      subscriber.onCompleted(); 

     } catch (QBResponseException e) { 
      subscriber.onError(e); 
     } 
    }); 
} 

Benutzer beobachtbaren

@Override 
public Observable<List<QBUser>> retrieveUsers() { 

    return retrieveLocations() 
      .flatMap(qbLocations -> Observable.from(qbLocations)) 
      .flatMap(qbLocation -> qbLocation.getUser()) 

      //How do I return an observable list with these users? 

} 

Antwort

0

Sie toList() Operator Produkte verwenden können, um sammeln wieder in eine Liste:

@Override 
    public Observable<List<QBUser>> retrieveUsers() { 
     return retrieveLocations() 
       .flatMap(qbLocations -> Observable.from(qbLocations)) 
       .flatMap(qbLocation -> qbLocation.getUser()) 
       .toList(); 
    } 
+0

wenn ich die 'ToList() in' Methode erhalte ich a ** Cyclic Inferenz ** Fusselfehler bei 'qbLocation -> qbLocation.getUser()'. – regmoraes

0

Ihr Code vereinfacht werden könnte:

@Override 
public Observable<List<QBUser>> retrieveUsers() { 
    return retrieveLocations() 
     .flatMapIterable(qbLocations -> qbLocations) 
     .map(qbLocation::getUser) 
     .toList(); 
} 

Auch würde ich Ihre retrieveLocations wie folgt umschreiben:

return Observable.defer(() -> Observable.just(QBLocations.getLocations(getLocationsBuilder, mBundle)); 

die mit einigen statischen Importen und Ausnahmebehandlung wird:

return defer(() -> { 
    try { 
    return just(getLocations(getLocationsBuilder, mBundle)); 
    } catch(Exeption e){ 
    return Observable.error(e); 
    } 
}); 

Abstrahieren Die Fehlerbehandlung macht es noch einfacher zu lesen:

Ist dies Ihre tatsächliche getLocations macht zurückkehren wie folgt aus:

return defer(() -> protect(() -> getLocations(getLocationsBuilder, mBundle))); 

Whops hat dies außer Kontrolle schlängelte ...

+1

Oder verwenden Sie 'fromCallable' und erhalten Sie die Ausnahmebehandlung ohne die Notwendigkeit eines try-catch. – akarnokd

Verwandte Themen