Цикл For с RxJava2 или RxKotlin

Я хочу создать асинхронную операцию, которая повторяет символы в заданной строке. У меня есть массив символов, взятый "mystring".toCharArray(). Я хочу повторить каждый 10-й символ с помощью RX.

Я знаю, что могу сделать это с помощью AsyncTask и циклов for, но я думал, что RX будет более элегантным решением. Я прочитал документацию, но не понял, как это сделать.

У меня есть еще одна идея создать PublishSubject и запустить onNext() в цикле for, индекс которого увеличивается на 10 с подпиской.

PS: "mystring" может быть намного больше, например json, xml или т. д. Пожалуйста, не стесняйтесь комментировать профилирование оперативной памяти.


person Emre Aktürk    schedule 01.02.2018    source источник


Ответы (1)


RxJava не поддерживает примитивные массивы, но вы можете использовать цикл for в форме оператора range и индексировать примитивный массив. С некоторой арифметикой индекса вы можете легко получить каждый 10-й символ:

char[] chars = ...

Observable.range(0, chars.length)
    .filter(idx -> idx % 10 == 0)
    .map(idx -> chars[idx])
    .subscribe(System.out::println);
person akarnokd    schedule 01.02.2018
comment
Я понял, что-то не дает мне покоя. С PublishSubject я могу итерировать меньше, что делает его быстрее? - person Emre Aktürk; 01.02.2018
comment
Зависит от того, что вы написали и как вы измеряете это как быстрее. - person akarnokd; 01.02.2018
comment
Выполнение циклов for в Java, а не в RxJava, всегда требует меньших накладных расходов. Я использую тест scrabble для измерения библиотек потоковой обработки, и вы можете получить в 4 раза больше накладных расходов с RxJava по сравнению с обычным циклом for, когда все синхронно. - person akarnokd; 01.02.2018
comment
Ты прав. Я также хочу написать код, который легко читается. Это компромисс. Я буду придерживаться диапазона. Спасибо - person Emre Aktürk; 01.02.2018