Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin RxJava:忽略可流动数据库中的一些错误_Kotlin_Rx Java2_Rx Kotlin2 - Fatal编程技术网

Kotlin RxJava:忽略可流动数据库中的一些错误

Kotlin RxJava:忽略可流动数据库中的一些错误,kotlin,rx-java2,rx-kotlin2,Kotlin,Rx Java2,Rx Kotlin2,我有一个可流动的和属于忽略此错误的子类型的错误我想忽略(导致优雅的完成),所有其他错误都应该向下游传播 科特林示例: val f : Flowable<T> = ... val g = f.onErrorComplete { it is IgnoreThisError } valf:Flowable=。。。 val g=f.onErrorComplete{忽略此错误} 这个函数是我需要的,不存在…类似的功能应该可以工作 f.onErrorResumeNext { if (

我有一个
可流动的
和属于
忽略此错误的子类型的错误
我想忽略(导致优雅的完成),所有其他错误都应该向下游传播

科特林示例:

val f : Flowable<T> = ...
val g = f.onErrorComplete { it is IgnoreThisError }
valf:Flowable=。。。
val g=f.onErrorComplete{忽略此错误}

这个函数是我需要的,不存在…

类似的功能应该可以工作

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)
})
f.onErrorResumeNext(函数{
如果(忽略此错误)
Flowable.empty()
其他的
可流动。错误(it)
})

以下是缺少的
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)
  }
/**
*提供的“predicate”返回true的流中遇到的错误将被静默地转换为优雅完成。
*/
@CheckReturnValue
@背压支架(背压固定已满)
@SchedulerSupport(SchedulerSupport.NONE)
内联fun Flowable.onErrorComplete(交叉内联谓词:(Throwable)->布尔):可流动=
onErrorResumeNext{错误:可丢弃->
if(谓词(错误))Flowable.empty()else Flowable.error(错误)
}

请注意,我必须输入一个显式的
错误:Throwable->
,否则编译器会因为
onErrorResumeNext

的重载而抱怨,类似这样的内容:
kotlin f.onErrorComplete{when(it){忽略此错误->…else->throw}
@NickRyan这个问题的全部原因是
可流动的
没有
onErrorComplete
。杰普,这和我找到的解决方案是一样的。如果没有适当的注释,编译器确实会疯掉……当然,如果您不止一次需要它,您可以定义
onErrorComplete
扩展函数。在我的答案中概括了解决方案。谢谢您可以使用
it
以外的名称,而不是禁止使用,例如
错误:Throwable->…
@NonNull
严格来说也是多余的,因为Kotlin将添加
@org.jetbrains.annotations.NotNull
注释。谢谢,我更改了答案。顺便说一句,这是我试图解决的根本问题: