我被这个问题卡住了,这个问题应该很简单。我需要订阅者执行一个代码块时,Maybe
已经作为一个Empty Maybe
完成。我发现
,
Maybe.isEmpty.blockingGet()
,但它也是脏的。我已经尝试了如下(Kotlin语法):
fun <T> Maybe<T>.subscribeWithEmptyHandler(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit, onEmpty: () -> Unit) {
this.isEmpty.subscribe({ if (it) onEmpty() }, { onError(it) })
this.subscribe({ onSuccess(it) }, { onError(it) })
}
但正如预期的那样,它运行了两次订阅,测试如下:
Maybe.create<Int> {
println("subscribing")
//Remove line below to create Empty Maybe
it.onSuccess(5)
it.onComplete()
}
.subscribeWithEmptyHandler({println("success")},{println("error")},{println("empty")})
有没有人能建议一下解决这个问题的更好的方法?
发布于 2018-06-07 07:52:18
使用Maybe.doOnEvent
(java示例):
Maybe
.empty()
.doOnEvent((value, error)-> {
if (value==null && error == null) {
System.out.println("empty!");
}})
.subscribe();
发布于 2018-06-07 00:36:20
我做了以下事情,这比我在问题中写的任何事情都要简洁:
fun <T> Maybe<T>.subscribeWithEmptyHandler(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit, onEmpty: () -> Unit) {
this.toSingle()
.subscribe(
{ onSuccess(it) },
{ if (it is NoSuchElementException) onEmpty() else onError(it) }
)
}
在这里,它只订阅一次,并且不涉及创建新的默认值。我仍然不确定这是不是最好的方法。
发布于 2021-03-15 06:35:18
有一个使用flatMap的解决方案
return Maybe.just<String>(smth)
.flatMap(
Function {
Maybe.just(it) // onSuccess
},
Function {
Maybe.error(it) // onError
},
Callable { // onComplete
Maybe.just("Empty")
}
)
或
return Maybe.just<String>(smth)
.flatMap(
{
Maybe.just<String>(it) // onSuccess
},
{
Maybe.error(it) // onError
},
{
Maybe.just("Empty") // onComplete
}
)
https://stackoverflow.com/questions/50724513
复制相似问题