RxJava运算符将随机大小的列表流分割成大小一致的列表,而不会丢失项目

时间:2018-10-14 01:19:35

标签: rx-java2

我有一个项目列表流(即每个发射都是一个列表)。列表长度不一。我想要一个运算符(或几个组合)可以重新分割列表,以使每个列表的长度相同。

这是一个简单的数组示例。

int[] array1 = {1, 2, 3};
int[] array2 = {4, 5};
int[] array3 = {6, 7, 8, 9};

Observable.just(array1, array2, array3)
        .emitGroupsOf2() // <--- what operator can I use here?
        .subscribe(ints -> {
            // I want:
            // emit {1,2}
            // emit {3,4}
            // emit {5,6}
            // emit {7,8}
            // complete
        });
    }

在此示例中,我想“坚持3”,直到听到4;然后我想“坚持到5”,直到听到6。最后,我想“扔掉” 9,因为我们再也没有价值来创建另一对了。

我看过mapscanbuffer,但没有一个是正确的。

1 个答案:

答案 0 :(得分:1)

RxJava不支持基本数组,因此您必须进行一些包装和展开:

Observable.just(array1, array2, array3)
    .concatMap(array -> Observable.range(0, array.length).map(idx -> array[idx]))
    .buffer(2)
    .map(buf -> {
        int[] result = new int[buf.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = buf.get(i);
        }
        return result;
    })
    .subscribe(ints -> System.out.println(Arrays.toString(ints)));