您可以hasElement()
在 Mono 中使用函数。看看这个对 Mono 的扩展函数:
inline fun <T> Mono<T>.errorIfEmpty(crossinline onError: () -> Throwable): Mono<T> {
return this.hasElement()
.flatMap { if (it) this else Mono.error(onError()) }
}
inline fun <T> Mono<T>.errorIfNotEmpty(crossinline onError: (T) -> Throwable): Mono<T> {
return this.hasElement()
.flatMap { if (it) Mono.error(onError.invoke(this.block()!!)) else this }
}
问题switchIfEmpty
在于它总是评估传入参数的表达式——编写这样的代码总是会产生 Foo 对象:
mono.switchIfEmpty(Foo())
您可以为传入参数的惰性求值表达式编写自己的扩展:
inline fun <T> Mono<T>.switchIfEmpty(crossinline default: () -> Mono<T>): Mono<T> {
return this.hasElement()
.flatMap { if (it) this else default() }
}
这里还有两个扩展功能 - 您可以使用它们来检查密码是否正确:
inline fun <T> Mono<T>.errorIf(crossinline predicate: (T) -> Boolean, crossinline throwable: (T) -> Throwable): Mono<T> {
return this.flatMap { if (predicate(it)) Mono.error(throwable(it)) else Mono.just(it) }
}
inline fun <T> Mono<T>.errorIfNot(crossinline predicate: (T) -> Boolean, crossinline throwable: (T) -> Throwable): Mono<T> {
return this.errorIf(predicate = { !predicate(it) }, throwable = throwable)
}