如何在 Spring 中有效地将排序后的通量分组为序列化组?

qbd*_*qbd 1 spring flux project-reactor spring-webflux

假设我有一个Flux包含许多(数十亿个字符串)的输入,如下所示:

  • 苹果
  • 应用
  • 圣经

这样的字符串有数十亿个,它们无法放入内存中,这就是我想使用反应式方法的原因。

流已排序。现在我想要的是通过前 3 个字符创建一系列有序字符串组:

  • 应用程序:苹果,应用程序
  • 围兜:圣经
  • 嘘:书

Flux最终会出现 HTTP 响应,这意味着所有“app”项目必须在“bib”项目开始之前输出。

如果不使用,Flux我可以使用有序属性并将项目收集到准备好的存储桶中(每个存储桶的字符串数量将适合内存) - 每当前缀发生变化时,我将刷新存储桶并开始收集新的前缀。有序流的一大优点是我知道一旦遇到新的前缀,旧的就不会再出现了。

但使用Flux我不知道如何做到这一点。将会.groupBy()返回FluxFlux但我认为在尝试将其序列化到 HTTP 响应输出流时这不会起作用。

Mic*_*rry 5

这几乎是教科书式的用例windowUntilChanged()

在你的情况下,你想要提取的“键”是字符串的前3个字母,所以你可以做类似的事情,flux.windowUntilChanged(str -> str.substring(0,3))这会给你一个Flux<Flux<String>>,其中内部通量开始和结束于你的前3个字母的变化细绳。当然,您可能需要添加一些额外的逻辑来处理长度小于 3 个字符的单词,但我会将其作为练习留给读者:-)

(我知道您在问题中提到过它,但只是为了澄清并为了其他人找到这个答案 -只有当流中的传入元素已经按字母顺序排序时,这才有效。)