Kotlin 根据if语句区分一个zip和另一个zip
我订购了两款拉链式单曲:Kotlin 根据if语句区分一个zip和另一个zip,kotlin,rx-java2,Kotlin,Rx Java2,我订购了两款拉链式单曲: firstRepository.sync(id) .zipWith(secondRepository.sync(id)) 现在,我想根据布尔值区分要同步的存储库。因此,我只能在一个存储库上进行同步,或者如果它们都是“已启用”的,则在它们上执行此zipWith操作符 如何以干净的方式完成此操作?您可以: map将每个存储库的排放映射到另一个包含该布尔标志的包装器类型中 在zip函数中,计算布尔标志以确定要使用哪个存储库的值 大概是这样的: class Re
firstRepository.sync(id)
.zipWith(secondRepository.sync(id))
现在,我想根据布尔值区分要同步的存储库。因此,我只能在一个存储库上进行同步,或者如果它们都是“已启用”的,则在它们上执行此zipWith操作符
如何以干净的方式完成此操作?您可以:
map
将每个存储库的排放映射到另一个包含该布尔标志的包装器类型中zip
函数中,计算布尔标志以确定要使用哪个存储库的值class Repository {
Single<Integer> sync(String id) {
return Single.just(Integer.valueOf(id));
}
}
class State {
final int value;
final boolean active;
State(int value, boolean active) {
this.value = value;
this.active = active;
}
}
final Repository firstRepository = new Repository();
final Repository secondRepository = new Repository();
final Single<State> firstEmission =
firstRepository
.sync(...)
.map(value -> new State(value, true)); // <-- boolean for firstRepository
final Single<State> secondEmission =
secondRepository
.sync(...)
.map(value -> new State(value, false)); // <-- boolean for secondRepository
firstEmission.zipWith(secondEmission, (first, second) -> {
if(first.active && !second.active) {
// firstRepository is active so use its emission...
return first.value;
} else if(!first.active && second.active) {
// secondRepository is active so use its emission...
return second.value;
} else if(first.active && second.active) {
// both repositories are active, so apply some special logic...
return first.value + second.value;
} else {
throw new RuntimeException("No active repository!");
}
})
.subscribe();
类存储库{
单同步(字符串id){
返回Single.just(Integer.valueOf(id));
}
}
阶级国家{
最终整数值;
最终布尔激活;
状态(int值,布尔激活){
这个值=值;
这个.active=active;
}
}
最终存储库firstRepository=新存储库();
最终存储库secondRepository=新存储库();
最终单次发射=
第一存储库
.sync(…)
.map(值->新状态(值,真));//新状态(值,false));//{
if(first.active&&!second.active){
//firstRepository处于活动状态,因此请使用其发射。。。
首先返回值;
}else如果(!first.active&&second.active){
//secondRepository处于活动状态,因此请使用其发射。。。
返回第二个值;
}else if(first.active&&second.active){
//两个存储库都是活动的,所以应用一些特殊的逻辑。。。
返回first.value+second.value;
}否则{
抛出新的RuntimeException(“无活动存储库!”);
}
})
.subscribe();