У меня есть Flowable<T>
и ошибки, которые являются подтипом IgnoreThisError
, которые я хочу игнорировать (что приводит к изящному завершению), все остальные ошибки должны распространяться ниже по течению.
Пример Котлина:
val f : Flowable<T> = ...
val g = f.onErrorComplete { it is IgnoreThisError }
Эта функция onErrorComplete - это то, что мне нужно, и ее не существует...
@NickRyan Вся причина вопроса в том, что нет onErrorComplete
вместо Flowable
.
Что-то вроде этого должно работать
f.onErrorResumeNext {
if (it is IgnoreThisError)
Flowable.empty()
else
Flowable.error(it)
}
Я не уверен, что Kotlin может правильно выводить типы здесь из-за перегрузки и эмуляции различий в подписях Java, если нет, вам может потребоваться более явное описание:
f.onErrorResumeNext(Function<Throwable, Publisher<T>> {
if (it is IgnoreThisError)
Flowable.empty()
else
Flowable.error(it)
})
Джепп, это то же самое решение, которое я нашел. Компилятор действительно сошел с ума без надлежащей аннотации...
Конечно, если вам это нужно более одного раза, вы можете просто определить функцию расширения onErrorComplete
.
В общем решение в моем ответе. Спасибо!
Вот решение для отсутствующей onErrorComplete
в качестве функции расширения:
/**
* Errors encountered in the stream for which the provided `predicate` returns true will be silently turned into graceful completion.
*/
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
@SchedulerSupport(SchedulerSupport.NONE)
inline fun <T> Flowable<T>.onErrorComplete(crossinline predicate: (Throwable) -> Boolean): Flowable<T> =
onErrorResumeNext { error: Throwable ->
if (predicate(error)) Flowable.empty<T>() else Flowable.error<T>(error)
}
Обратите внимание, что мне пришлось поставить явное error: Throwable ->
, иначе компилятор будет жаловаться из-за перегрузок onErrorResumeNext
.
Вместо подавления вы можете использовать имя, отличное от it
, например. error: Throwable -> ...
. @NonNull
также, строго говоря, избыточен, поскольку Kotlin добавит аннотацию @org.jetbrains.annotations.NotNull
.
Спасибо, я изменил ответ.
Кстати, это основная проблема, которую я пытался решить: stackoverflow.com/q/55529892/3612643
Что-то вроде этого:
kotlin f.onErrorComplete { when (it) { is IgnoreThisError -> ... else -> throw it } }