如何在 RxJava 中压缩 2 个不同长度的可观察对象
How to zip 2 observables with different length in RxJava
我有两个可观察值:
Observable<String[]>
和
Observable<KalturaVideo>
我想检查每个 KalturaVideo.getId(),它是否包含在 String[] 中,returns 首先是可观察的,如果包含,则不要在 源列表.
所以,第一个 observable 只发射 String[] 一次,而第二个 observable 发射 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 - 我想从 sourceList、KalturaVideoRetriver.getVideoList[ 中排除的 KalturaVideo 列表=33=] - returns sourceList
此解决方案只能给我一个 KalturaVideo,但我需要 17 个
您可以使用 combineLatest
而不是 zip
:
return Observable.combineLatest(
targetIdList,
KalturaVideoRetriver.getVideoList(BuildPlaylistStep2Activity.this, kalturaPlaylistId),
(String[] idListOfTarget, KalturaVideo kalturaVideo) -> {
...
return kalturaVideo;
})
combineLatest
的工作方式与 zip
类似,但它结合了每个的最新发射。
所以在你的例子中,你的 targetIdList
observable 发出一个 String[]
。 combineLatest
将使用其他可观察对象的每次发射压缩它。
我有两个可观察值:
Observable<String[]>
和
Observable<KalturaVideo>
我想检查每个 KalturaVideo.getId(),它是否包含在 String[] 中,returns 首先是可观察的,如果包含,则不要在 源列表.
所以,第一个 observable 只发射 String[] 一次,而第二个 observable 发射 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 - 我想从 sourceList、KalturaVideoRetriver.getVideoList[ 中排除的 KalturaVideo 列表=33=] - returns sourceList
此解决方案只能给我一个 KalturaVideo,但我需要 17 个
您可以使用 combineLatest
而不是 zip
:
return Observable.combineLatest(
targetIdList,
KalturaVideoRetriver.getVideoList(BuildPlaylistStep2Activity.this, kalturaPlaylistId),
(String[] idListOfTarget, KalturaVideo kalturaVideo) -> {
...
return kalturaVideo;
})
combineLatest
的工作方式与 zip
类似,但它结合了每个的最新发射。
所以在你的例子中,你的 targetIdList
observable 发出一个 String[]
。 combineLatest
将使用其他可观察对象的每次发射压缩它。