Flowable.compose () для преобразования в Single или Maybe - PullRequest
0 голосов
/ 03 февраля 2019

Есть ли в RxJava2 оператор, который может применить преобразование из Flowable в Single или Maybe?Я имею в виду Flowable.compose() оператор применяет Transformer к Flowable и возвращает еще один Flowable.Но мне нужно применить трансформатор, который преобразует Flowable в Single или Mabye и который может быть многократно использован в моем приложении без " разрыва цепи ".

Пример (на котлине):

fun processFirstEven(f: Flowable<Int>): Maybe<Int> {
    return f.filter { i -> i % 2 == 0 }.take(1).singleElement().map { s -> s * 12 }
}

val f: Maybe<Int> = Flowable
        .fromArray(1, 3, 5, 6, 7, 8, 9)
        .compose(::processFirstEven) // Does not compile

1 Ответ

0 голосов
/ 03 февраля 2019

Я не думаю, что есть способ сделать такое сложное преобразование в одну строку.Похоже, это уже довольно просто для меня:

fun takeFirstEven(f: Flowable<Int>): Flowable<Int> {
    return f.filter { i -> i % 2 == 0 }.take(1)
}

val f: Maybe<Int> = Flowable
    .fromArray(1, 3, 5, 6, 7, 8, 9)
    .compose(::takeFirstEven)
    .singleElement()

Хорошая новость заключается в том, что если ваши цели - просто возможность повторного использования , вы можете использовать функция расширения функций Котлина чтобы сделать именно это.

Поместите этот код туда, куда ваш код может получить доступ:

fun <T> Flowable<T>.toMaybe(filter: (T) -> Boolean): Maybe<T> {
    return this.filter(filter).take(1).singleElement()
}

Тогда вы можете просто использовать toMaybe в любом месте с любым фильтром, который вам нужен.

fun evenFilter(i: Int) = (i % 2) == 0

val f: Maybe<Int> = Flowable
    .fromArray(1, 3, 5, 6, 7, 8, 9)
    .toMaybe(::evenFilter)
...