如果源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();
}
}
答案 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
。