我正在尝试拨打3个网络服务电话(例如:getPhoneNumber
,getFirstName
,getLastName
)并将答案收集到公共对象Person
中。任何Web服务调用都可以返回Maybe.empty()
。
一起尝试zip
响应时,rxjava2
会跳过zip操作并正常终止(没有汇总我的回答)。
有关简化示例,请参阅以下内容:
@Test
public void maybeZipEmptyTest() throws Exception {
Maybe<Integer> a = Maybe.just(1);
Maybe<Integer> b = Maybe.just(2);
Maybe<Integer> empty = Maybe.empty();
TestObserver<String> observer = Maybe.zip(a, b, empty, (x, y, e) -> {
String output = "test: a "+x+" b "+y+" empty "+e;
return output;
})
.doOnSuccess(output -> {
System.out.println(output);
})
.test();
observer.assertNoErrors();
}
我们如何在zip操作中收集空值而不是跳过/忽略zip操作?如果这是解决此问题的错误模式,您会如何建议解决此问题?
答案 0 :(得分:2)
对于大多数用例,利用defaultIfEmpty
方法是正确的方法。
为了表示最终可选的内容(甚至不使用默认值),我使用Java 8 Optional
类型来表示。
例如
@Test
public void maybeZipEmptyTest() throws Exception {
Maybe<Optional<Integer>> a = Maybe.just(Optional.of(1));
Maybe<Optional<Integer>> b = Maybe.just(Optional.of(2));
Maybe<Optional<Integer>> empty = Maybe.just(Optional.empty());
TestObserver<String> observer = Maybe.zip(a, b, empty, (x, y, e) -> {
String output = "test: a "+toStringOrEmpty(x)+" b "+toStringOrEmpty(y)+" empty "+toStringOrEmpty(e);
return output;
})
.doOnSuccess(output -> {
System.out.println(output);
})
.test();
observer.assertNoErrors();
}
private String toStringOrEmpty(Optional<Integer> value){
if(value.isPresent()){
return value.get().toString();
}
else {
return "";
}
}