Java 代码的外观是否常见;祈使句;支持反应式代码?

Java 代码的外观是否常见;祈使句;支持反应式代码?,java,project-reactor,reactor,imperative-programming,Java,Project Reactor,Reactor,Imperative Programming,我似乎开始编写“命令式”方法来支持反应链的功能性/可读性。这可能不是最技术性的问题,但这是常见的吗 @Component public class MyRequestHandler { public Mono<ServerResponse> add(ServerRequest request) { return request.bodyToMono(MyPOJO.class).flatMap(this::add)

我似乎开始编写“命令式”方法来支持反应链的功能性/可读性。这可能不是最技术性的问题,但这是常见的吗

@Component
public class MyRequestHandler {

    public Mono<ServerResponse> add(ServerRequest request) {
        return request.bodyToMono(MyPOJO.class).flatMap(this::add)
                                                 .switchIfEmpty(ServerResponse.noContent().build());
    }

    /*
     * this code supports add(ServerRequest)
     *   also simplifies returning a Mono<ServerResponse>
     */
    private Mono<ServerResponse> add(MyPOJO myPOJO) {
        System.out.println("Received >> " + myPOJO.toString());
        return (myPOJO.getValue() % 2 == 0 ) ? ServerResponse.ok()
                                                               .body(Mono.just(true), Boolean.class)
                                               : ServerResponse.ok()
                                                               .body(Mono.just(false), Boolean.class);
    }
}
@组件
公共类MyRequestHandler{
公共Mono添加(服务器请求){
return request.bodyToMono(MyPOJO.class).flatMap(this::add)
.switchIfEmpty(ServerResponse.noContent().build());
}
/*
*此代码支持添加(ServerRequest)
*还简化了返回单声道的过程
*/
专用单声道添加(MyPOJO MyPOJO){
System.out.println(“已接收>>”+myPOJO.toString());
返回(myPOJO.getValue()%2==0)?ServerResponse.ok()
.body(Mono.just(true),Boolean.class)
:ServerResponse.ok()
.body(Mono.just(false),Boolean.class);
}
}

将命令式代码和反应式/功能性代码混合在一起有时是做事情的最清晰的方式——它本身没有什么问题。(有时这样做是因为作者不知道“更好”的功能方式,但只要可读,也没有本质上的问题。)

但是,这里的代码没有什么特别“必要的”——您只是将内部
flatMap()
代码提取到一个单独的方法中。该方法仍然返回一个被动元素,并且由单个被动流调用组成

这是否正常,是否可以接受?两人都同意。这里应用的规则与“普通”OO编程相同,即将代码分离为可测试、可重用(或潜在可重用)元素

这里我只想补充两点。首先,在您的示例中根本不需要三元运算符,最好是:

return ServerResponse.ok()
        .body(Mono.just(myPOJO.getValue() % 2 == 0), Boolean.class)

其次,不要为了调试目的而在钩子中任意打印“接收到的”值,您可以在Flux上使用
log()
,并使用“跟踪”调试级别来提供更详细的日志记录。

Michael-感谢您的反馈,并注意到这两个附加点。相当笨拙的println调试是因为这是“一次性”代码,我只是用它来探索反应式编程的特定方面。尽管如此,我们还是非常感谢Flux.log()上的信息。