【问题标题】:Modify Mono if other Mono is empty in project Reactor?如果项目 Reactor 中的其他 Mono 为空,则修改 Mono?
【发布时间】:2018-11-25 17:19:39
【问题描述】:

我有一个Mono,当其他Mono 为空时,我想修改它。

第一Mono

deviceRepository.getDevice(deviceId, userId): Mono<Device>

第二个Mono

registrationRepository.canRegister(deviceId) : Mono<DeviceRegistrationInfo>

canRegister为给定的deviceId返回空单声道时,我想要实现的是返回修改后的Mono&lt;Device&gt;

device.copy(status = DeviceStatus.REGISTRATION_FAILED)

同样,我想修改Flux&lt;Device&gt; 的每个发射以组合:

deviceRepository.getDevices(userId) : Flux<Device>

registrationRepository.getAllRegistrationInfos(): Flux<DeviceRegistrationInfo>

【问题讨论】:

    标签: kotlin project-reactor


    【解决方案1】:

    仅仅使用流是不可能做你想做的事的。流和反应流都不是为这种类型的条件逻辑设计的。这是该框架的最大缺点之一。当模式匹配出现在 java 13 或 14 中时,它可能会得到解决。

    但我们并非完全没有选择。作为可选的解决方案。我的示例是用 Java 编写的,但我确信它足以让您开始。

    它也适用于 Flux。

    @Test
    public void c(){
        //Mono<Optional<DeviceRegistrationInfo>> second = Mono.just(Optional.ofNullable(new DeviceRegistrationInfo()));
        Mono<Optional<DeviceRegistrationInfo>> second = Mono.just(Optional.empty());
        Mono<Device> device_ = Mono.just(new Device());
    
        second
                .map( info -> info.map( t -> device_) )  //you can put what you want in that map function and it will be executed only if optional is there
                .filter(Optional::isPresent)
                .flatMap(Optional::get)
                .subscribe(System.out::println);
    
    }
    

    【讨论】:

      【解决方案2】:

      受@piotr szybicki 答案的启发,我想出了以下答案:

          val canRegister: Mono<Optional<PreRegistrationInfo>> = preRegistrationRepository.canRegister(deviceId)
          val foundDevice: Mono<Device> = deviceRepository.getDevice(deviceId, userId);
      
          return canRegister.flatMap {
              when {
                  !it.isPresent -> foundDevice.map(this::overrideStatusIfNeeded)
                  else -> foundDevice
              }
          }
      }
      
      private fun overrideStatusIfNeeded(it: Device) = if (it.status == DeviceStatus.ADDED) {
          it.copy(status = DeviceStatus.REGISTRATION_FAILED)
      } else {
          it
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 2021-11-23
        • 2020-08-25
        • 1970-01-01
        • 2018-12-26
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多