我如何在 smallrye mutiny 中对 Multi 进行排序

How do i sort a Multi in smallrye mutiny

其他反应式库,如 project reactor 为 Publishers 提供了排序方法,但在 mutiny 中没有这样的方法。 他们的文档甚至没有谈论它。

https://smallrye.io/smallrye-mutiny

现在我正在通过这样做实现上述功能

multi.collectItems()
.asList()
.map(
list -> {
  list.sort();
  return list;
})
.convert()
.with(listUni -> Multi.createFrom().iterable(listUni.await().indefinitely()))

有没有更好的方法来做同样的事情?

我认为没有 built-in/better 方法可以做到这一点。

Mutiny 通常以在其核心中拥有一组“cut-down”运算符而自豪,并允许您根据需要构建其他更复杂的运算符。他们试图避免反应器的情况,即您在几个核心类型上有 100 多个方法,并且如果没有大量的背景知识,通常很难知道哪些是相关的。

恕我直言,这不是坏事。其他响应式框架肯定有这些 built-in sort() 运算符,但这里有一个危险——人们认为他们仍然可以将它们视为无限的、神奇排序的发布者,因为在任何地方都没有任何集合的迹象。你当然不能——在内部,这些框架必须维护一个底层集合来对数据进行排序,然后在流完成时输出它的内容。然而,这并不是那么清楚,对这一事实的无知通常会导致意外的减速和 OutOfMemoryError。相反,在您的示例中,很明显该流使用底层集合对数据进行排序。

在您的示例中我只更改了一件小事,但与您的问题并没有真正相关 - 我会使用:

list.stream().sorted().collect(Collectors.toList())

...在您的地图调用中而不是对可变列表进行排序。在反应流中改变数据结构有点代码味道。

我使用的另一种方法 - 一旦 multis 与 .collect().in(TREE_MAP_SUPPLIER, MULTI_MAP_ACCUMULATOR)

一起出现,就将它们合并到 TreeMap 中