我有一个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>
答案 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
}