从 Observable 获取数组的值
Get values of an Array from an Observable
我有一个 Observable<MoviesResponse>
。我的 MovieResponse
class 包含一个 getResults()
方法返回一个 List<Result>
。此结果 class 有一个 getTitle()
方法返回一个字符串。我想调用我所有 Result
objects 的 getTitle()
方法来获取我所有电影的标题。
我通过下面的代码使用 foreach 循环实现了这一点,但我认为通过链接 RxJava 运算符有更好的方法来做到这一点,我只是想不通...
订阅:
Observable<MoviesResponse> moviesResponseObservable = apiService.getTopRatedMoviesObservable(API_KEY);
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MoviesResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MoviesResponse moviesResponse) {
List<Result> results = moviesResponse.getResults();
for (Result r:results) {
Log.d(LOG_TAG,r.getTitle());
}
}
});
接口:
public interface ApiService {
@GET("movie/top_rated")
Observable<MoviesResponse> getTopRatedMoviesObservable(@Query("api_key") String apiKey);
}
您可以使用 flatmap to transform your observable into an Observable<Result>
and then use map 将其转换为 Observable<String>
,然后您可以订阅它。
moviesReponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Function<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> apply(@NonNull MoviesResponse moviesResponse) throws Exception {
return moviesResponse.getResults();
}
})
.map(new Function<Result, String>() {
@Override
public String apply(@NonNull Result result) throws Exception {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
Log.d("TAG", s);
}
/* ... */
});
@zsmb13 的回答出现以下错误:
new Function : map (rx.functions.Func1) in
Observable cannot be applied to (anonymous
java.util.function.Function)reason:
no instance(s) of type variable(s) R exist so that Function conforms to Func1
无论如何,这个答案很有帮助我只是用 Func1
替换了 Function
并使用了 call
方法。
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Func1<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> call(MoviesResponse moviesResponse) {
return moviesResponse.getResults();
}
})
.map(new Func1<Result, String>() {
@Override
public String call(Result result) {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d(LOG_TAG, s);
}
});
我有一个 Observable<MoviesResponse>
。我的 MovieResponse
class 包含一个 getResults()
方法返回一个 List<Result>
。此结果 class 有一个 getTitle()
方法返回一个字符串。我想调用我所有 Result
objects 的 getTitle()
方法来获取我所有电影的标题。
我通过下面的代码使用 foreach 循环实现了这一点,但我认为通过链接 RxJava 运算符有更好的方法来做到这一点,我只是想不通...
订阅:
Observable<MoviesResponse> moviesResponseObservable = apiService.getTopRatedMoviesObservable(API_KEY);
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MoviesResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MoviesResponse moviesResponse) {
List<Result> results = moviesResponse.getResults();
for (Result r:results) {
Log.d(LOG_TAG,r.getTitle());
}
}
});
接口:
public interface ApiService {
@GET("movie/top_rated")
Observable<MoviesResponse> getTopRatedMoviesObservable(@Query("api_key") String apiKey);
}
您可以使用 flatmap to transform your observable into an Observable<Result>
and then use map 将其转换为 Observable<String>
,然后您可以订阅它。
moviesReponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Function<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> apply(@NonNull MoviesResponse moviesResponse) throws Exception {
return moviesResponse.getResults();
}
})
.map(new Function<Result, String>() {
@Override
public String apply(@NonNull Result result) throws Exception {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onNext(String s) {
Log.d("TAG", s);
}
/* ... */
});
@zsmb13 的回答出现以下错误:
new Function : map (rx.functions.Func1) in Observable cannot be applied to (anonymous java.util.function.Function)reason: no instance(s) of type variable(s) R exist so that Function conforms to Func1
无论如何,这个答案很有帮助我只是用 Func1
替换了 Function
并使用了 call
方法。
subscription = moviesResponseObservable
.subscribeOn(Schedulers.io())
.flatMapIterable(new Func1<MoviesResponse, Iterable<Result>>() {
@Override
public Iterable<Result> call(MoviesResponse moviesResponse) {
return moviesResponse.getResults();
}
})
.map(new Func1<Result, String>() {
@Override
public String call(Result result) {
return result.getTitle();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d(LOG_TAG, s);
}
});