响应式编程

响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式
在命令式编程(我们的日常编程模式)下,式子a=b+c,这就意味着a的值是由b和c计算出来的。如果b或者c后续有变化,不会影响到a的值
在响应式编程下,式子a:=b+c,这就意味着a的值是由b和c计算出来的。但如果b或者c的值后续有变化,会影响到a的值
我认为上面的例子已经可以帮助我们理解变化传递(propagation of change)

lambda:

函数式编程接口:
@FunctionalInterface



其中在函数式接口中有一些只适合在函数式中使用的官方封装好的接口方法
如BiFunction,Tuple
BiFunction适用于两个参数,而Function适用于一个参数
Function的使用:


    /**
     * 一个参数的调用返回
     *
     * @param option
     * @param funOptionService
     * @return
     */
    public static Mono<ServerResponse> oneOptionalParams(Optional<String> option,
                                                         Function<Optional<String>, Mono<JSONObject>> funOptionService,
                                                         String judgeParam) {
        //option is not Present and the judgeParams not null then badRequest
        if (!option.isPresent() && (null != judgeParam) && judgeParam != "") {
            return (Mono<ServerResponse>) ServerResponseBuild.badRequestMsg("参数" + judgeParam + "不能为空");
        }
        Mono<JSONObject> jsonObjectMono = funOptionService.apply(option);
        return jsonObjectMono.flatMap(
                resultJson -> {
                    if (resultJson.getInteger("errcode") != 0) {
                        return ServerResponseBuild.badRequestMsg(resultJson.getString("errmsg"));
                    }
                    log.info("\n返回数据:{}", resultJson);
                    return ServerResponseBuild.okRequestObj(resultJson, JSONObject.class);
                }
        ).switchIfEmpty(ServerResponseBuild.badRequestMsg("请求错误")
        ).onErrorResume(error -> ServerResponseBuild.badRequestMsg(error.getMessage()));
    }

BiFunction两个参数的

    /**
     * 两个参数的调用返回
     * @param option1
     * @param option2
     * @param funBiOptionService
     * @param judgeParams
     * @return
     */
    public static Mono<ServerResponse> twoOptionalParams(Optional<String> option1, Optional<String> option2,
                                                         BiFunction<Optional<String>, Optional<String>, Mono<JSONObject>> funBiOptionService,
                                                         String... judgeParams) {
        //省略judgeParams...
        Mono<JSONObject> jsonObjectMono = null;
        try {
            jsonObjectMono = funBiOptionService.apply(option1, option2);
        } catch (Exception e) {
            return Mono.error(e);
        }
        return jsonObjectMono.flatMap(
                resultJson -> {
                    if (resultJson.getInteger("errcode") != 0) {
                        return ServerResponseBuild.badRequestMsg(resultJson.getString("errmsg"));
                    }
                    log.info("\n返回数据:{}", resultJson);
                    return ServerResponseBuild.okRequestObj(resultJson, JSONObject.class);
                }
        ).switchIfEmpty(ServerResponseBuild.badRequestMsg("请求错误")
        ).onErrorResume(error -> ServerResponseBuild.badRequestMsg(error.getMessage()));
    }

函数式调用

这样写起来确实看上去简洁了许多
且这样调用可以调用接收多个参数
一个参数:

    /**
     * 获取访问用户身份
     *
     * @param request
     * @return
     */
    public Mono<ServerResponse> getuserInfo(ServerRequest request) {
        return ServerResponseBuild.oneOptionalParams(request.queryParam("code"),
                option -> manIdentityVerifyService.getUserInfo(option),
                "code");
    }

上面的写法可以改为:

    /**
     * 获取访问用户身份
     *
     * @param request
     * @return
     */
    public Mono<ServerResponse> getuserInfo(ServerRequest request) {
        return ServerResponseBuild.oneOptionalParams(request.queryParam("code"),
                manIdentityVerifyService::getUserInfo,
                "code");
    }

两个参数的同样可以使用::方式来调用方法

    /**
     * ~~~~不给你看注释
     * @return
     */
    public Mono<ServerResponse> getConversations(ServerRequest request) {
        return ServerResponseBuild.twoOptionalParams(
                request.queryParam("seq"),
                request.queryParam("limit"),
                chatMsgSaveService::monoGetChatContent,
                "seq", "limit");
    }
posted @   ukyo--碳水化合物  阅读(2723)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2018-11-23 [数据库] - org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection
点击右上角即可分享
微信分享提示
主题色彩
一定要解放台湾。