Оператор RxJava для сегментирования потока списков случайного размера в списки одинакового размера без потери элементов - PullRequest
0 голосов
/ 14 октября 2018

У меня есть поток списка предметов (т.е. каждый выпуск - это список).Списки имеют разную длину.Мне нужен оператор (или несколько в комбинации), который может повторно сегментировать списки, чтобы каждый список имел одинаковую длину.

Вот простой пример с массивами.

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
        });
    }

Inв этом примере я хочу «держаться до 3», пока не услышу 4;затем я хочу "держаться до 5", пока не услышу 6. Наконец, я хочу "выбросить" 9, поскольку у нас никогда не было другого значения для создания другой пары.

Я смотрел на map иscan и buffer, но ни одна из них не работает правильно.

1 Ответ

0 голосов
/ 15 октября 2018

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)));
...