首页 > 解决方案 > 使用 Spring Webflux 将 Flux 转换为树

问题描述

我们最近开始将 Spring WebMVC 代码重构为 WebFlux,用 WebClient 替换 RestTemplate。

从外部 Web 服务器,我们收到一个对象(产品)的平面列表,每个对象都包含对父对象的引用:

            webClient
                .get()
                .uri(productURI)
                .retrieve()
                .bodyToFlux(Product.class)

我们现在将此产品列表转换为树状结构,由少数根产品(作为列表)和每个根产品下方分层结构中的许多子产品组成。

在之前的代码中,转换很容易完成,因为我们最终得到了完整的平面列表,我们从中创建了一个新的结果列表。

对于反应流,我很困惑如何将原始的 Flux of Products 转换为完全不同的结构。

标签: javareactivewebflux

解决方案


有多种解决方案可用。

如果您的数据适合内存,响应没有分页并且您想保留现有的实现,您可以将其收集Flux<Product>到一个列表中并使用现有的算法。

productFlux
.collectList()
.map(products -> buildTree(products))

如果您想更有效地计算树结构,例如由于以分页方式加载数据,则reduce操作符将是可行的方法。

productFlux
.reduce(new ProductTree(), (tree, nextProduct) -> tree.add(nextProduct))

在这里,树需要一种方法add(nextProduct)来分多个步骤构建最终树。


推荐阅读