Igo*_*nyi 3 java flux project-reactor option-type
我有从套接字接收的动态热数据流。我需要检查条件,如果值匹配,则跳转到步骤 3 并显示新消息。
final Flux<Msg> msgs = Flux.generate(receiver);
final Flux<Msg> processed = msgs
.map(this::checkCondition) //step1
.map(remote::doLongRunning) //optional step2
.map(this::processFurther) //step3
...
public Msg checkCondition(Msg msg) {
if(doCheck(msg)){
//is there a way to jump to step3 here ?
return new OtherMsg(msg, "someAdditionalData"))
} else{
return msg
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一选择 - 是将 Flux 分开并将其组装回来,有没有更干净的方法?
final Flux<Msg> msgs = Flux.generate(receiver);
final Flux<OtherMsg> checked = msgs
.filter(this::doCheck) //step1
.map(msg -> new OtherMsg(msg, "someAdditionalData"));
final Flux<OtherMsg> unchecked = msgs
.filter(msg -> !doCheck(msg)) //step1
.map(remote::doLongRunning); //optional step2
Flux.merge(checked, unchecked)
.map(this::processFurther) //step3
Run Code Online (Sandbox Code Playgroud)
您无法跳过步骤,但可以flatMap()与三元运算符一起使用以实现条件分支的形式:
final Flux<Msg> processed = msgs
.flatMap(msg -> doCheck(msg)
? Mono.just(new OtherMsg(msg, "someAdditionalData")).map(remote::doLongRunning)
: Mono.just(msg))
.map(this::processFurther);
Run Code Online (Sandbox Code Playgroud)
这样您就可以调用任何其他方法来操作三元表达式第一部分中的值,而第二部分将确保在doCheck()返回 false 时绕过它。processFurther()将在flatMap()调用后执行,因此无论如何都会执行。
| 归档时间: |
|
| 查看次数: |
2457 次 |
| 最近记录: |