2016-03-19 1 views
0

の位置のリストを出力するObservableがあります。これらのLocationオブジェクトはユーザ(実際には?)を返すメソッドgetUser()を持っています。私がしようとしているのは、Locationオブジェクトのこのリストを与えられたUserオブジェクトのリストを発行する新しいObservableを返すことです。ここに私のコードです:観察可能Rx JavaでObservable.from()演算子を適用した後で項目を再連結します

場所は

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); 
     } 
    }); 
} 

ユーザー観察可能

@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? 

} 
あなたがリストに戻ってあなたのアイテムを収集するために toList()演算子を使用することができます

答えて

0

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

私は 'ToListメソッド()'メソッドを追加した場合、私は**巡回を取得推論** 'qbLocation - > qbLocation.getUser()'でのリントエラー。 – regmoraes

0

あなたのコードを簡素化することができます。

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

また、以下のように、私はあなたのretrieveLocationsを書き換えたい:

いくつかの静的インポートと例外処理となり
return Observable.defer(() -> Observable.just(QBLocations.getLocations(getLocationsBuilder, mBundle)); 

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

抽象化をエラー処理により、読みやすくなります。

@FunctionalInterface 
public interface <T,R,E> ThrowningFunction { R apply(T t) throws E; } 
@FunctionalInterface 
public interface <R,E> ThrowningSupplier { R get() throws E; } 

public static <T,R> Func1<T,Observable<R>> protect(ThrowningFunction<T,R,?> func) { 
    return t -> { 
    try { 
     return Observable.just(func.apply(t)); 
    } catch(Exception e) { 
     return Observable.error(e); 
    } 
    } 
} 

public static <R> Func0<Observable<R>> protect(ThrowningSupplier<R,?> func) { 
    return() -> { 
    try { 
     return Observable.just(func.get()); 
    } catch(Exception e) { 
     return Observable.error(e); 
    } 
    } 
} 

これはあなたの実際のgetLocationsは次のように返します:これは制御不能に蛇行した

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

Whops、...

+1

また、 'fromCallable'を使用して、try-catchを必要とせずに例外処理を取得してください。 – akarnokd

関連する問題