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

标签 java reactive-programming rx-java

我有两个可观察对象:

Observable<String[]>

Observable<KalturaVideo>

我想检查每个 KalturaVideo.getId(),它是否包含在 String[] 中,它首先返回 observable,如果包含,则不要在 sourceList 中发出它。

因此,第一个 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 中排除的 KalturaVideo 列表,KalturaVideoRetriver.getVideoList - 返回 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 会将其与您的其他可观察对象的每次发射一起压缩。

关于java - 如何在 RxJava 中压缩 2 个不同长度的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29734862/

相关文章:

javascript - 以间隔执行异步请求的冷静方式?

spring-security - 使用 ReactiveSecurityContextHolder 手动设置身份验证

oop - 面向对象编程和响应式(Reactive)编程的区别

android - RXJava 将函数应用于 Observable 中的每个元素并返回它的可观察值

java - 用于选择性数据捕获的 Servlet 过滤器

java - 使用已在构造函数中初始化的类的属性

java - 仅当满足特定 boolean 情况时才让 Observable 返回

java - 如何从 List<Single<List<Int>>> 中收集所有整数并将其放入 RxJava 中的 List<Int> 中?

java - Java如何高效管理内存

Java流控制