如何在 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 - 我想从 sourceListKalturaVideoRetriver.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 将使用其他可观察对象的每次发射压缩它。