Комментарии 25
А можете посоветовать какую-нибудь литературу по Rx, которая мозги в нужную сторону вправляет?
Ибо документация — это, конечно, хорошо, «понятно», и всё такое…
Но в моих чертогах разума Rx до сих пор лежит где-то за дверью «Не влезай — убьёт» на одной полочке с Brainfuck-ом.
Ибо документация — это, конечно, хорошо, «понятно», и всё такое…
Но в моих чертогах разума Rx до сих пор лежит где-то за дверью «Не влезай — убьёт» на одной полочке с Brainfuck-ом.
0
Я прочел книгу Reactive Programming with RxJava, насколько я помню она есть и на русском. Покороче можно прочесть эту — Nickolay Tsvetinov: Learning Reactive Programming With Java 8
0
использовать subscribe в subscribe это не правильно, для этого есть сглаживающие операторы типа {concat, flat}Map
0
Мне тоже не очень понравилось такое решение, но сделать без двух subscribe не вышло, они так и напрашивались! Если вы сможете подсказать как вы бы это сделали пусть даже для C#, буду благодарен
0
вот тут https://jsbin.com/jedarub/1/edit?js,console
0
Но вообще надо запомнить, что Rx лучше для асинхронных вещей, а синхронные вещи лучше решать через guava или в scala/kotlin это уже встроено для работы с коллекциями
+1
Да, тут я с вами согласен, эти примеры с коллекциями придуманы больше для наглядности и понимания операторов
0
Правда я rx юзал только на c# и js. Кстати http://xgrommx.github.io/rx-book/content/resources/articles/index.html#rx
0
я начал изучение RxJs из исходников, и очень доволен этой литературой
0
В подспорье автору — больее подходящая реализация третьей задачи на C#
int count = 98;
var result = Range(2, count)
.Where(p =>
!(Range(2, count).Count(n=>p%n == 0) > 1)
);
0
Уверен вы решили еще мгновенно
-1
По поводу третьей задачи, не совсем понятно зачем там лишние проверки и конверторы, все решается как показано ниже:
Observable.range(2, 100)
.filter({isPrime(it)})
.reduce({s1, s2 -> s1+" "+s2})
.subscribe({System.out.println it })
0
Подскажите, какой Rx вы здесь применили? В RxJava в таком исполнении будут некоторые проблемы:
Во-первых оператор range реализован в виде
Во-вторых насколько я понимаю оператор reduce принимает на вход функцию
На счет takeWhile я соглашусь — можно было отказаться от него указав диапазон в range, здесь я оставил такую реализацию чтобы использовать большее разнообразие операторов
Во-первых оператор range реализован в виде
range(int start, int count)
, то есть будут взяты элементы не с 2 по 100, а с 2 по 101.Во-вторых насколько я понимаю оператор reduce принимает на вход функцию
Func2<T, T, T>
, то есть два входных и выходной объекты должны быть одного типа, то есть подавать на вход int-ы не получится, приходится преобразовать их в String, если мы хотим получить String на выходеНа счет takeWhile я соглашусь — можно было отказаться от него указав диапазон в range, здесь я оставил такую реализацию чтобы использовать большее разнообразие операторов
0
Объясните, пожалуйста, чем это отличается от стримов? Единственный плюс, который вижу, это класс Subject, который позваляет добавлять данные в подписку.
0
Хороший вопрос, согласен, между стримами и Rx очень много общего, полагаю что они легко смогут подменить друг друга по функционалу. Признаться в стримы я не погружался и не пробовал их на практике, и мне кажется что тут уже выбор за вами
0
Примеры приведенные автором это только малая часть Rx. Причем именно та часть, которую можно заменить стримами или методами для работы с коллекциями в kotlin/scala. Но, как уже говорилось, они чисто для наглядности.
Интересности начинаются, когда доходит до Schedulers, Subjects, обработки ошибок и прочих вещей.
Интересности начинаются, когда доходит до Schedulers, Subjects, обработки ошибок и прочих вещей.
0
По поводу четвертой задачи, все решается через один оператор reduce
, на груви выглядит так:
def whatDivider = { int n ->
if (n % 3 == 0) return 3
if (n % 7 == 0) return 7
return 0;
}
Observable.range(1, 20)
.reduce([:], {Map acc, int x ->
final n = whatDivider(x)
if (n == 0) return acc
acc[n] = (acc[n] ?: []) + x
acc
})
.subscribe({
it.each{ k, v -> println("Can be divided without remainder by ${k}: ${v}")}
});
На джаве должно быть не на много длиннее.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Насколько гибкими являются наши знания в области операторов Rx?