也许switchIfEmpty懒惰的评价

时间:2018-04-18 18:26:11

标签: java rx-java rx-java2

如果源Maybe为空,我使用switchIfEmpty Maybe方法提供备用结果。但是,我希望只有当源为空时才执行备用源,而当源不为空时不执行备用源。

在以下示例中,如果源返回非空costlyFallback,我希望避免执行Maybe。当前实现总是调用它,因为它需要传递给switchIfEmpty方法。 Maybe.fromCallable看起来很有希望,但它只适用于不能返回Maybe.empty的callables。任何提示都表示赞赏。如果switchIfEmpty接受一些懒惰评估的Maybe提供商,那就太好了。

public class StartRxMaybe {

public static void main(String... args) {
    System.out.println(new StartRxMaybe().start().blockingGet());
}

private Maybe<Integer> start() {
    return func()
        .switchIfEmpty(costlyFallback());
}

private Maybe<Integer> func() {
    System.out.println("Non-empty maybe returned");
    return Maybe.just(1);

}

private Maybe<Integer> costlyFallback() {
    System.out.println("Fallback executed anyway");
    return LocalDate.now().getMonth() == Month.JULY
        ? Maybe.just(2)
        : Maybe.empty();
}
}

2 个答案:

答案 0 :(得分:9)

我想我找到了解决方案。使用Maybe.defer可以解决问题并允许通过供应商:

private Maybe<Integer> start() {
    return func()
        .switchIfEmpty(Maybe.defer(this::costlyFallback));
}

答案 1 :(得分:1)

感谢 @nosalan ,这是我对Kotlin的解决方案:

fun getOperator(id: Int): Single<Operator> {
    return db.getOperator(id)
        .switchIfEmpty(Single.defer { api.getOperators }
                .flattenAsFlowable { it }
                // etc.
        )
}

注意{}而不是()中的defer