如何在RxJava中压缩两个不同长度的可观察对象



我有两个可观测值:

Observable<String[]>

Observable<KalturaVideo>

我想检查每个KalturaVideo.getId(),它是否包含在String[]中,该字符串返回第一个可观察的值,如果它包含,则不要在sourceList中使用它。

所以,第一个可观察到的emmits String[]只有一次,但第二个可观察的emmits-items有17次。如何正确地组合这两个可观察性?这是我的解决方案:

private Observable<KalturaVideo> getSourceListObservalbe(String kalturaPlaylistId){
Observable<String[]> targetIdList = Observable.just(targetList)
.map((List<KalturaVideo> kalturaVideos) -> {
if(kalturaVideos == null || kalturaVideos.isEmpty()){
return new String[]{""};
}
String[] result = new String[kalturaVideos.size()];
int index = 0;
for (KalturaVideo item : kalturaVideos) {
result[index] = item.getId();
}
return result;
});
return Observable.zip(
targetIdList,
KalturaVideoRetriver.getVideoList(BuildPlaylistStep2Activity.this, kalturaPlaylistId),
(String[] idListOfTarget, KalturaVideo kalturaVideo) -> {
for (String item :idListOfTarget){
if(item.equals(kalturaVideo.getId())){
return null;
}
}
return kalturaVideo;
})
.filter(kalturaVideo -> {
return kalturaVideo != null;
});
}

targetList-KalturaVideo的列表,我想将其从sourceListalturaVideoRetriver.getVideoList-返回sourceList

这个解决方案只给我一个KalturaVideo,但我需要17

您可以使用combineLatest而不是zip:

return Observable.combineLatest(
targetIdList,
KalturaVideoRetriver.getVideoList(BuildPlaylistStep2Activity.this, kalturaPlaylistId),
(String[] idListOfTarget, KalturaVideo kalturaVideo) -> {
...
return kalturaVideo;
})

combineLatest的工作原理与zip类似,但它结合了每一个的最新发射。

因此,在您的情况下,您的targetIdList可观测到发射单个String[]combineLatest会随着你其他可观测到的每一次发射而压缩。

最新更新