简体   繁体   English

如何在RxJava中压缩2个不同长度的observable

[英]How to zip 2 observables with different length in RxJava

I have two observables: 我有两个可观察量:

Observable<String[]>

and

Observable<KalturaVideo>

I want to check for every KalturaVideo.getId(), is it contains in String[], which returns first observable, and if it contains, then don't emmit it in sourceList . 我想检查每个KalturaVideo.getId(),它是否包含在String []中,它返回第一个observable,如果它包含,则不要在sourceList中发出它。

So, first observable emmits String[] only one time, but second observable emmits items 17 times. 所以,第一个可观察到的emmits String []只有一次,但第二个可观察到的emmits项目是17次。 How to compose this two observables properly? 如何恰当地组合这两个可观测量? Here is my Solution: 这是我的解决方案:

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 - list of KalturaVideo, which I want to exclude from sourceList , KalturaVideoRetriver.getVideoList - returns sourceList targetList - 我想从sourceList中排除的KalturaVideo列表, KalturaVideoRetriver.getVideoList - 返回sourceList

This solution gets me only one KalturaVideo, but I need 17 这个解决方案只给我一个KalturaVideo,但我需要17个

You could use combineLatest rather than zip : 你可以使用combineLatest而不是zip

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

combineLatest works like zip , but it combines the most-recent emission of each. combineLatestzip combineLatest工作,但它结合了每个的最新发射。

So in your case, your targetIdList observable emits a single String[] . 所以在你的情况下,你的targetIdList observable会发出一个String[] combineLatest will zip that with every emission from your other observable. combineLatest会将其与您的其他可观察物的每次发射相关联。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM