如何有效地将已排序的通量分组到 Spring 中的序列化组?
How to efficiently group a sorted flux into serialized groups in Spring?
假设我有一个输入 Flux
包含许多(数十亿个字符串),如下所示:
- 苹果
- 申请
- 圣经
- 本书
有数十亿个这样的字符串,它们无法放入内存,这就是我想使用反应式方法的原因。
流已排序。现在我想要的是通过前 3 个字符创建一系列有序的字符串组:
- 应用:苹果,应用程序
- 围兜:圣经
- 嘘:书
此 Flux
以 HTTP 响应结束,这意味着所有“app”项目必须在“bib”项目开始之前输出。
在不使用 Flux
的情况下,我可以使用有序的 属性 并将项目收集到准备好的桶中(每个桶的字符串数量将适合内存) - 只要前缀发生变化,我将冲洗桶并开始收集新的前缀。流排序的一大好处就是我知道一旦遇到新的前缀,旧的就再也不会来了。
但是使用 Flux
我不知道该怎么做。 .groupBy()
将 return Flux
of Flux
但我认为这在尝试将其序列化为 HTTP 响应输出流时不会起作用。
这几乎是 windowUntilChanged()
的教科书用例。
在你的例子中,你想要提取的“关键”是字符串的前 3 个字母,所以你可以做类似 flux.windowUntilChanged(str -> str.substring(0,3))
的事情,这会给你一个 Flux<Flux<String>>
,其中内部通量在字符串中的前 3 个字母发生变化时开始和结束。当然,您可能想添加一些额外的逻辑来处理长度少于 3 个字符的单词,但我将把它留作 reader :-)
的练习
(我知道你在问题中提到了它,但只是为了澄清和其他人找到这个答案的缘故 - 这将 只有 如果传入元素流已经按字母顺序排序。)
假设我有一个输入 Flux
包含许多(数十亿个字符串),如下所示:
- 苹果
- 申请
- 圣经
- 本书
有数十亿个这样的字符串,它们无法放入内存,这就是我想使用反应式方法的原因。
流已排序。现在我想要的是通过前 3 个字符创建一系列有序的字符串组:
- 应用:苹果,应用程序
- 围兜:圣经
- 嘘:书
此 Flux
以 HTTP 响应结束,这意味着所有“app”项目必须在“bib”项目开始之前输出。
在不使用 Flux
的情况下,我可以使用有序的 属性 并将项目收集到准备好的桶中(每个桶的字符串数量将适合内存) - 只要前缀发生变化,我将冲洗桶并开始收集新的前缀。流排序的一大好处就是我知道一旦遇到新的前缀,旧的就再也不会来了。
但是使用 Flux
我不知道该怎么做。 .groupBy()
将 return Flux
of Flux
但我认为这在尝试将其序列化为 HTTP 响应输出流时不会起作用。
这几乎是 windowUntilChanged()
的教科书用例。
在你的例子中,你想要提取的“关键”是字符串的前 3 个字母,所以你可以做类似 flux.windowUntilChanged(str -> str.substring(0,3))
的事情,这会给你一个 Flux<Flux<String>>
,其中内部通量在字符串中的前 3 个字母发生变化时开始和结束。当然,您可能想添加一些额外的逻辑来处理长度少于 3 个字符的单词,但我将把它留作 reader :-)
(我知道你在问题中提到了它,但只是为了澄清和其他人找到这个答案的缘故 - 这将 只有 如果传入元素流已经按字母顺序排序。)