java - 使用 Spring Webflux 将 Flux 转换为树
问题描述
我们最近开始将 Spring WebMVC 代码重构为 WebFlux,用 WebClient 替换 RestTemplate。
从外部 Web 服务器,我们收到一个对象(产品)的平面列表,每个对象都包含对父对象的引用:
webClient
.get()
.uri(productURI)
.retrieve()
.bodyToFlux(Product.class)
我们现在将此产品列表转换为树状结构,由少数根产品(作为列表)和每个根产品下方分层结构中的许多子产品组成。
在之前的代码中,转换很容易完成,因为我们最终得到了完整的平面列表,我们从中创建了一个新的结果列表。
对于反应流,我很困惑如何将原始的 Flux of Products 转换为完全不同的结构。
解决方案
有多种解决方案可用。
如果您的数据适合内存,响应没有分页并且您想保留现有的实现,您可以将其收集Flux<Product>
到一个列表中并使用现有的算法。
productFlux
.collectList()
.map(products -> buildTree(products))
如果您想更有效地计算树结构,例如由于以分页方式加载数据,则reduce
操作符将是可行的方法。
productFlux
.reduce(new ProductTree(), (tree, nextProduct) -> tree.add(nextProduct))
在这里,树需要一种方法add(nextProduct)
来分多个步骤构建最终树。
推荐阅读
- python - 如何解压缩字符串格式的列表列表?
- node.js - “这个页面不工作 localhost 没有发送任何数据。” 导航到绑定到 docker 容器的 localhost 端口时
- javascript - 从另一个文档中引用 firebase 文档变量
- python - 读取数组中的单个字符串
- android-webview - Android WebView中出现Bootstrap Modal时如何禁用滑动刷新?
- r - 扩展 sapply 以应用变量列表并将输出保存为 R 中的数据框列表
- python - 如何制作唯一文件的多个副本导致不同的文件名
- javascript - 所有 document.getElementById('') 返回 null
- javascript - 为什么 CodeMirror JavaScript 没有定义 Uncaught ReferenceError
- php - Laravel 7.0:登录错误 - 这些凭据与我们的记录不匹配