嵌套 zip 导致 Observable 的 return 值不合适
Nested zip's causing return value of Observable to misfit
我是反应式编程的新手,这个方法无法编译,我无法正确使用,
public Observable<Data> findData(long templateId) {
..
..
return Observable.zip(templateObs, dataObs, (templateObj, dataObj) -> {
try {
switch(model) {
case SINGLE: {
..
..
return new Data();
}
case TOURNAMENT: {
// compilation error on the entire .zip block :
// Type mismatch: cannot convert from Observable<Object> to Observable<Data>
return Observable.zip(obs1, obs2, obs3, obs4, (data, data2, data3, data4) -> {
..
..
return new Data(data1,data2,data3,data4);
}).flatMap(results -> results);
}
}
}catch(DataException e) {
log.error(e);
}
return null;
});
}
出于某种原因,内部 return .zip return Observable 而不是 Observable - 这会导致编译错误...
如果我从内部 .zip 中删除 'return' 然后它编译。
zip
需要一个 return 和 Object
的 lambda,在你的例子中是 Data
,这就是你在 SINGLE
中所做的案例.
在 TOURNAMENT
你 return 一个 Observable 不是 Data
对象。
根据您的情况,如果您想要 return 一个 Data
,那么您必须使用 toBlocking
方法阻止您需要的 zip
运算符。
case TOURNAMENT:
return Observable.zip(obs1, obs2, obs3, obs4,
(data, data2, data3, data4) ->
{ return new Data(data1,data2,data3,data4); }
).toBlocking().single();
否则,您可以 return 而不是 Data
对象 Observable<Data>
。在这种情况下,只需将您的 SINGLE
案例更改为 return 一个 Observable
,它将仅发出您的 Data
对象。
case SINGLE: return Observable.just(new Data());
我是反应式编程的新手,这个方法无法编译,我无法正确使用,
public Observable<Data> findData(long templateId) {
..
..
return Observable.zip(templateObs, dataObs, (templateObj, dataObj) -> {
try {
switch(model) {
case SINGLE: {
..
..
return new Data();
}
case TOURNAMENT: {
// compilation error on the entire .zip block :
// Type mismatch: cannot convert from Observable<Object> to Observable<Data>
return Observable.zip(obs1, obs2, obs3, obs4, (data, data2, data3, data4) -> {
..
..
return new Data(data1,data2,data3,data4);
}).flatMap(results -> results);
}
}
}catch(DataException e) {
log.error(e);
}
return null;
});
}
出于某种原因,内部 return .zip return Observable 而不是 Observable - 这会导致编译错误...
如果我从内部 .zip 中删除 'return' 然后它编译。
zip
需要一个 return 和 Object
的 lambda,在你的例子中是 Data
,这就是你在 SINGLE
中所做的案例.
在 TOURNAMENT
你 return 一个 Observable 不是 Data
对象。
根据您的情况,如果您想要 return 一个 Data
,那么您必须使用 toBlocking
方法阻止您需要的 zip
运算符。
case TOURNAMENT:
return Observable.zip(obs1, obs2, obs3, obs4,
(data, data2, data3, data4) ->
{ return new Data(data1,data2,data3,data4); }
).toBlocking().single();
否则,您可以 return 而不是 Data
对象 Observable<Data>
。在这种情况下,只需将您的 SINGLE
案例更改为 return 一个 Observable
,它将仅发出您的 Data
对象。
case SINGLE: return Observable.just(new Data());