首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Rxjava2交错项目

使用Rxjava2交错项目
EN

Stack Overflow用户
提问于 2018-10-24 02:21:21
回答 3查看 35关注 0票数 0

给出两个可观察的流{1,3}和{2,4}是否有任何运算符可以产生{1,2,3,4}的结果

我以为merge就是为了这个,然后继续做

代码语言:javascript
复制
List<Integer> result=Observable.merge(Observable.fromIterable(Arrays.asList(1,3)),Observable.fromIterable(Arrays.asList(2,4))).toList().blockingGet();

然而,我后来发现合并“可以”交错,但只要执行同步操作,它就不会。

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-24 06:22:39

对此没有标准的运算符。您可以尝试将项目映射到( index,value)的元组中,其中第一个源的index为0、2、4等,第二个源的index为1、3、5。然后使用orderedMerge比较元组的索引,然后在合并之后提取值。

如下所示:

代码语言:javascript
复制
AtomicInteger index1 = new AtomicInteger();
Flowable<Pair<Integer, T>> indexedSource1 = source1
    .map(v -> new Pair<>(index1.getAndAdd(2), v));

AtomicInteger index2 = new AtomicInteger(1);
Flowable<Pair<Integer, T>> indexedSource2 = source2
    .map(v -> new Pair<>(index2.getAndAdd(2), v));

Flowables.orderedMerge(
    (a, b) -> a.first.compareTo(b.first), 
    indexedSource1, 
    indexedSource2
)
.map(v -> v.second);
票数 2
EN

Stack Overflow用户

发布于 2018-11-13 18:34:37

我还有一种方法可以做到这一点。从上面给出的解决方案中,我看不到明显的好处。然而,它只使用一个普通的zip操作符来实现结果。

代码语言:javascript
复制
        List<Integer> intArray1 = Arrays.asList(1,3,5,7);
        List<Integer> intArray2 = Arrays.asList(2,4,6,8);
        Observable.zip(
                Observable.fromIterable(intArray1),
                Observable.fromIterable(intArray2),
                (numbers1, numbers2) -> new Pair<>(numbers1, numbers2)).
                collect(ArrayList<Integer>::new,
                        (list, pair) -> {
                            list.add(pair.first);
                            list.add(pair.second);
                        }).
                subscribe(mergedList -> {
                    Log.d("List", mergedList.size() + "");
                });
票数 0
EN

Stack Overflow用户

发布于 2018-10-24 04:26:12

如果源是冷可观测的,并且如果我需要组合源的元素,我将使用zip

代码语言:javascript
复制
    Observable<Integer> stream1 = Observable.fromIterable(Arrays.asList(1, 3));
    Observable<Integer> stream2 = Observable.fromIterable(Arrays.asList(2, 4));

    List<Integer> integers = Observable.zip(stream1, stream2, (a, b) -> Observable.just(a, b))
            .flatMap(ob -> ob)
            .toList()
            .blockingGet();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52955497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档