更新 Reactor 中对象的状态

2023-12-30

给出以下方法:

private Mono<UserProfileUpdate> upsertUserIdentifier(UserProfileUpdate profileUpdate, String id){
    return userIdentifierRepository.findUserIdentifier(id)
            .switchIfEmpty(Mono.defer(() -> {
                profileUpdate.setNewUser(true);
                return createProfileIdentifier(profileUpdate.getType(), id);
            }))
            .map(userIdentifier -> {
                profileUpdate.setProfileId(userIdentifier.getProfileId());
                return profileUpdate;
            });
}

switchIfEmpty and map运营商变异profileUpdate目的。突变安全吗switchIfEmpty操作员?关于map,如果我理解正确的话,这是不安全和反对的profileUpdate一定是不可变的,对吧?例如:

private Mono<UserProfileUpdate> upsertUserIdentifier(UserProfileUpdate profileUpdate, String id){
        return userIdentifierRepository.findUserIdentifier(id)
                .switchIfEmpty(Mono.defer(() -> {
                    profileUpdate.setNewUser(true);
                    return createProfileIdentifier(profileUpdate.getType(), id);
                }))
                .map(userIdentifier -> profileUpdate.withProfileId(userIdentifier.getProfileId()));
    }

在链的后面,另一个方法改变了对象:

public Mono<UserProfileUpdate> transform(UserProfileUpdate profUpdate) {
        if (profUpdate.isNewUser()) {
            profUpdate.getAttributesToSet().putAll(profUpdate.getAttributesToSim());
        } else if (!profUpdate.getAttributesToSim().isEmpty()) {
            return  userProfileRepository.findUserProfileById(profUpdate.getProfileId())
                    .map(profile -> {
                        profUpdate.getAttributesToSet().putAll(
                                collectMissingAttributes(profUpdate.getAttributesToSim(), profile.getAttributes().keySet()));
                        return profUpdate;
                    });
        }
        return Mono.just(profUpdate);
    }

上述方法的调用方式如下:

  Mono.just(update)
  .flatMap(update -> upsertUserIdentifier(update, id))
  .flatMap(this::transform)

答案含糊不清,但是……这要看情况!

改变返回值中的输入参数的危险Mono or Flux来自这样的事实Mono or Flux可以多次订阅。在这种情况下,突然你有一个共享资源在你的手上,它可能会导致令人费解的问题。

但如果所讨论的方法是从良好控制的上下文中调用的,那么它可能是安全的。

就你而言,flatMap确保内部发布者仅订阅一次。所以只要你only在此类 flatMap 中使用这些方法,它们可以安全地改变其输入参数(它保留在 flatmapping 函数的范围内)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新 Reactor 中对象的状态 的相关文章

随机推荐

  • BigQuery:如何使用新的存储 JSON 文件自动重新加载表?

    我刚刚通过链接 Google Cloud Storage 中的可用 JSON 文件创建了一个 BigQuery 表 但我没有看到任何选项可以自动重新加载表行以及在 Google Cloud Storage 文件夹或存储桶中添加的新文件 目前
  • Java:内存分析器工具(MAT)用法:比较两个堆转储

    我正在使用 Eclipse MAT 插件 我可以看到一个 hprof 文件堆历史记录 我为 Java 应用程序拍摄了两张快照 我希望当我比较两个堆转储时 我可以找出哪些对象实例增加很多 以便我可以识别内存泄漏的可能性 netbean 能做到
  • 如何使用 TextMate 对 csv 文件的每个值应用双引号?

    我有一个 csv 文件 格式如下 示例 csv bear brown mean large ant black strong tiny cat yellow moody small 如何在每个值周围应用双引号 我如何使用正则表达式来完成此操
  • jsf 页面的中心组件

    我试图将组件放在 jsf 页面的中心 它看起来像这样
  • JPA/Eclipselink 缓存生命周期

    1 我正在使用 Glassfish 2 1 和 EcipseLink 2 0 0 所以实际上使用 JPA 1 0 规范 并且我有一个无状态 EJB 可以查找实体等 据我所知 JPA 1 0 定义了一个在持久性上下文级别 无状态 EJB 的事
  • Spring Data Rest 字段转换器

    我很难使用我的自定义转换器spring data REST项目 无控制器应用程序和严格的java配置 我有两个实体 一个雇员和一个国家 这种关系是 ManyToOne 我相信我们都知道这一点 无论如何 问题在于转换state字段 字段名称是
  • Windows 上的“系统”和“系统空闲进程”PID 是否恒定?

    在我看过的几个 Windows XP 系统上 系统空闲进程 始终具有 PID 0 而 系统 进程始终具有 PID 4 在枚举进程的 Windows 程序中 识别这些进程是否安全由这些 PID 决定 还是在某些情况下它们可能不同 我的生产代码
  • 如何在 Swift 中将“addTarget”添加到 UILabel

    我正在尝试在 Swift 中添加标签 这些标签是在循环中添加的 然后 我想在添加每个事件时为其添加一个 TapGesture 事件 它可以工作 但问题是 调用的函数从标签中获取数据以在单击时使用 但那时标签已被重新定义 并且它从最后添加的标
  • JFreechart,带填充区域的折线图

    我正在尝试创建如下图表 虽然我几乎通过简单地创建折线图并为渲染器自定义形状 绘制来实现了所有目标 但我似乎找不到一种方法来填充系列线下方的区域 任何线索 我该怎么做 您可以使用以下命令创建图表StackedXYAreaRenderer ht
  • Python urllib2 不尊重超时

    以下两行代码永远挂起 import urllib2 urllib2 urlopen https www 5giay vn timeout 5 这是 python2 7 的情况 我没有设置 http proxy 或任何其他环境变量 任何其他网
  • 无法在 Eclipse 中创建 Xtext 项目

    I installed Xtext 2 12 from the Eclipse Marketplace I m using Eclipse Neon 3 Release 4 6 3 Following the directions in t
  • CMake - 强制 find_package 更新缓存变量

    在我的 CMake 项目中 我提供了用户可编辑的 Boost 的默认路径 set PATH BOOST DEFAULT softs boost BOOST VER ARCH gcc GCCVER set PATH BOOST PATH BO
  • 初始页面加载时光滑滑块宽度为 0

    我在使用 Slick Slider 时遇到了一个非常奇怪的问题 有时 在第一页加载时 幻灯片和轨道宽度被设置为 0 我已经尝试了许多解决方案 包括 设置超时然后调用slick 通过JS触发窗口大小调整事件 将所有光滑元素的最小高度设置为 1
  • WordPress 在“save_post”操作中将 post_status 设置为“草稿”

    我有一个适用于我的自定义帖子类型的自定义函数 加工时save post action add action save post my custom function 我想将帖子状态设置为草稿 以防从外部 api 获取自定义数据出现问题 在我
  • jQuery:如何知道表格行何时失去焦点?

    在表行中 tr 有几个输入元素 当 tr 失去焦点时 但不是当用户只是切换到同一 tr 中的不同输入元素时 我需要执行一些 JavaScript 代码 我使用 jQuery 如何做到跨浏览器 我想您正在寻找这种方法 demo http js
  • 从 Access VBA 运行存储过程

    我不断收到以下错误 从字符串转换日期和 或时间时转换失败 这是我正在使用的 vba 以及我的 sql server 存储过程语法 我应该改变什么才能成功运行 Private Sub btnRunStoredProc Click Dim cm
  • 具有 GCD 的后进先出堆栈?

    我有一个 UITableView 它显示与每行中的联系人关联的图像 在某些情况下 这些图像是在第一次显示时从地址簿联系人图像中读取的 如果没有 则它们是基于存储的数据呈现的化身 我目前正在使用 GCD 在后台线程上更新这些图像 但是 这会按
  • 在 JQuery Mobile 中两个不同文件的三个页面之间导航

    为什么我无法从 secondary html 导航到另一个内部页面 page3 我能够从 index html 导航到 secondary html 我的代码如下所示 索引 html 页面 不幸的是 这是行不通的 这只是将多个 HTML 模
  • 设置 OpenCV 2.4.3 和 Microsoft Visual Studio 2012 (Win8 x64)

    我要配置opencv with 视觉工作室2012 on Windows 8 x64 我配置了opencv并且没有编译错误 但是当我执行我的程序时 我收到此错误 程序无法启动 因为MSVCR100D dll你的中缺失了 电脑 我尝试安装适用
  • 更新 Reactor 中对象的状态

    给出以下方法 private Mono