Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 根据if语句区分一个zip和另一个zip_Kotlin_Rx Java2 - Fatal编程技术网

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();