代码之家  ›  专栏  ›  技术社区  ›  Mangat Rai Modi

RXJava也许:有什么简单的方法来处理空盒子吗?

  •  1
  • Mangat Rai Modi  · 技术社区  · 6 年前

    我被这个问题困住了,应该很简单。当 Maybe 已作为 Empty Maybe . 我发现

    1. 我们可以传递默认值或使用switchifempty,但我觉得两者都很粗糙。
    2. 此外,还有一个subscribe函数接受oncomplete函数(以及其他两个事件的处理程序),但oncomplete不接受任何参数,这些参数可用于查找may是否为空完成。
    3. 另一种方法可能是 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")})
    

    有人能提出更简洁的方法来解决这个问题吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Dave Moten    6 年前

    使用 Maybe.doOnEvent (Java示例):

    Maybe
     .empty()
     .doOnEvent((value, error)-> {
        if (value==null && error == null) {
          System.out.println("empty!");
        }})
     .subscribe();
    
        2
  •  2
  •   Mangat Rai Modi    6 年前

    我所做的下列事情比我在问题中所写的任何事情都要整洁:

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

    这里它只订阅一次,不需要创建新的默认值。仍然不确定这是否是最好的方法。