RxJava可能:任何处理空案件的巧妙方法?

时间:2018-06-06 15:46:08

标签: kotlin rx-java rx-kotlin

我遇到了这个问题,应该很简单。当Maybe作为Empty Maybe完成时,我需要订阅者执行代码块。我找到了

  1. 我们可以传递默认的Maybe值或使用switchIfEmpty,但我觉得两者都是hacky。
  2. 还有一个订阅函数,它接受onComplete函数(以及其他两个事件的处理程序),但是onComplete不接受任何可用于查找是否可能已完成为空的参数。
  3. 另一种方式可能是Maybe.isEmpty.blockingGet(),但它也很脏。
  4. 我试过以下( 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")})
    

    有人可以建议更简洁的解决方法吗?

3 个答案:

答案 0 :(得分:3)

使用Maybe.doOnEvent(java示例):

Maybe
 .empty()
 .doOnEvent((value, error)-> {
    if (value==null && error == null) {
      System.out.println("empty!");
    }})
 .subscribe();

答案 1 :(得分:1)

我做了以下比我在问题中写的更整洁: -

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) }
        )
}

此处它只订阅一次,不涉及创建新的默认值。仍然不确定这是否是最佳方式。

答案 2 :(得分:0)

有一个使用 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
                    }
                )