- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设您有这样的代码:
public List<Group> addUserToGroups(String username, String label) {
Mono<User> userMono = webClient.getUser(username);
User user = userMono.block();
Flux<Group> groupsFlux = webClient.getGroups(label);
List<Group> groups = groupsFlux.collectList().block();
groups.forEach(group ->
webClient.addUserToGroup(user.getId(), group.getId()).block()
);
return groups;
}
但是现在你想将这段代码重构为一个非阻塞的响应式(Reactive)管道,并且 main 方法返回一个 Flux<Group>
。 .
所以也许你会开始做这样的事情:
public Flux<Group> addUserToGroups(String username, String label) {
return webClient.getUser(username)
.flatMapMany(user -> webClient.getGroups(label))
...
}
但现在我们遇到了一个问题,结果 Flux
中的值是Group
我们需要 User
我们在下一步中丢失的信息。
因此,希望的管道数据流可以这样表示:
start
|
U
| /
|/
G1,U
| \
| UG1----|
| |
G2,U G1
| \ |
| UG2----|
| |
G2
|
result: G1, G2
UGn is the result of calling webClient.addUserToGroup
什么是正确的实现方式?
最佳答案
一般来说,每当您觉得需要映射到另一个值,但又要保留已有的值时,您有以下三种基本选择:
flatMap()
调用;元组
);嵌套 flatMap()
调用的优点是它快速且简单,但缺点是如果嵌套级别过多,代码可能变得几乎不可读。组合解决了这个问题,但是您显然需要创建新类型(或使用 Tuple
类型,这显然不太具有描述性。)
更改对象结构是两全其美的方法如果这样做有意义,因此值得考虑 - 但大多数时候,根据我的经验,这是不可行或不明智的。
恕我直言,在这里使用嵌套调用会很好,因为它只是一个嵌套级别 - 类似于:
return webClient.getUser(username)
.flatMapMany(
user -> webClient.getGroups(label)
.flatMap(group -> webClient.addUserToGroup(user.getId(), group.getId()).thenReturn(group))
)
.collectList();
不一定与问题相关,但还有第二个方面我不太喜欢这种方法 - 它实际上做了两件事 - 它为用户检索组,然后然后触发关闭第二次调用以将用户添加到组中(功能似乎有点奇怪,但我不知道用例。)如果可以的话,我建议将这两个功能分成两个单独的方法。
关于java - 如何在不丢失数据的情况下与不同的发布者建立 react 性管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59322406/
我想使用 Java 实现各种发布者/订阅者模式,但目前没有想法。 有 1 个发布者和 N 个订阅者,发布者发布对象,然后每个订阅者需要按照正确的顺序处理每个对象一次且仅一次。发布者和每个订阅者在自己的
我正在学习发布者/订阅者模式,并做了一个简单的例子来更好地理解它。 var Publisher = { subscribers: {}, Subscribe: functi
这是我目前挂断的一般设计问题。它导致了一些心理代码块......如果它只是一个常见的陷阱,我不想继续这样,但如果它被接受使用,我想继续,因为代码非常干净并且解耦(除了横切消息)。 我在代码中有一个基于
当我打开安装程序(使用NSIS创建)时,会出现UAC对话框,其中包含有关安装程序的信息。字段发布者为“未知”。我听说过对应用程序进行数字签名,您知道如何在NSIS中执行此操作吗? 如何将字段/属性发布
我正在使用具有 DefaultMessageListenerContainer 的 pub/sub 模型。我已将并发消费者配置为 5 个。如何唯一标识每个消费者? 我试图将相应监听器处理的每个事件存储
我想创建一个可以从不同线程调用的 RabbitMQ 发布者。 根据 RabbitMQ 最佳实践,我不应允许在不同线程中使用同一 channel ,因此在发布者的多个实例中共享此 channel 将导致
是否可以仅通过使用事件(即不是列表或字典)在 WCF 中实现发布者/订阅者模型? 如果是,请向我提供示例应用程序的网络链接,或任何讨论此问题的文章。 最佳答案 是的。 Here是一篇关于它的 MSDN
我使用 rosjava 作为订阅者和 rospy 作为发布者实现了发布/订阅。但是,我没有收到 rospy 的任何消息。我在这里错过了什么吗? JAVA 订阅者(假设 IP 为:1.1.1.1) pu
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试签署一个小程序,这样发布者就不会显示为“未知”: 我为一个组织工作,我们有我们自己的证书颁发机构,证书链如下:ORG Root CA > ORG Trusted Certification
这是对我尝试使用 combine 实现的目标的过度简化。 如果发生某些事情,我需要向共享发布者注入(inject)一个值。 在这里您可以看到,如果 map 接收到数字 2,我使用原始发布者上的发送命令
我们有以下使用 .NET RabbitMQ 库的场景: 工作线程从队列中获取“请求”消息,并将它们分派(dispatch)到多个工作线程上进行处理。完成后,每个工作线程都会发送另一条消息。 我的问题是
当我将一些 Objective-C 代码移植到 Swift 时,我试图更好地理解新的 Combine 框架以及我如何使用它来重新创建一个通用的设计模式。 在这种情况下,设计模式是单个对象(管理器、服务
我有一个基本的 ZeroMQ 场景,由两个发布者和一个订阅者组成。在我决定将局域网内不同计算机上的所有进程分开之前,这在本地计算机上一直运行良好。这就是我创建 ZeroMQ 套接字的方式(简化的 Py
我目前正在尝试使用 0MQ 创建代理。我想订阅一个不在 0MQ 下运行的发布者。我的意思是我有发送 XML 文件的远程发布者的地址和端口,我想获取该文件。不幸的是,我没有收到发布者的任何消息,但它发送
我尝试使用 C++ 在 ZeroMQ 中开发发布者订阅者模型,我从 JSON 文件中提取对象值并将其发送到另一端。 我的订户部分运行良好,但出现任何错误。但是我在发布者部分面临以下错误:(在 if 语
我问过 Google 并搜索过 NServiceBus 网站和论坛,但我似乎找不到任何关于如何编写 Java 应用程序来订阅发布者的说明性指导。有没有人有任何这样的联系或经验? 最佳答案 这种情况并没
有谁知道如何使用 CruiseControl.Net 发布到 FTP 服务器? 最佳答案 我认为没有特定的方法可以做到这一点。您当然可以始终在 cruise control.net 的窗口中运行命令行
我正在尝试使用Ocelot在ASP.Net API网关中使用JWT承载身份验证,以与多个授权机构/发行者一起工作。一个颁发者是Auth0,另一个是基于IdentityServer4的内部身份验证服务器
如何删除 Visual Studio Marketplace 发布者? 在 https://marketplace.visualstudio.com/manage/publishers/ 上查看我的帐
我是一名优秀的程序员,十分优秀!