如果项目Reactor中的其他Mono为空,是否修改Mono?

时间:2018-11-25 17:19:39

标签: kotlin project-reactor

我有一个Mono,我想在其他Mono为空时进行修改。

第一个Mono

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

第二Mono

registrationRepository.canRegister(deviceId) : Mono<DeviceRegistrationInfo>

我要实现的是,当Mono<Device>返回给定canRegister的空单声道时,返回修改后的deviceId

device.copy(status = DeviceStatus.REGISTRATION_FAILED)

类似地,我想针对以下组合修改Flux<Device>的每次发射:

deviceRepository.getDevices(userId) : Flux<Device>

registrationRepository.getAllRegistrationInfos(): Flux<DeviceRegistrationInfo>

2 个答案:

答案 0 :(得分:2)

仅使用流就无法做您想要的事情。流和无功流都不是针对这种条件逻辑设计的。这是框架最大的缺点之一。当模式匹配出现在Java 13或14中时,可能会得到解决。

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

它也适用于助焊剂。

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

}

答案 1 :(得分:0)

受@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
}