3

其他响应式库(如项目反应器)为发布者提供排序方法,但在兵变中没有这种方法。他们的文档甚至没有谈论它。

https://smallrye.io/smallrye-mutiny

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

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

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

4

2 回答 2

2

我不相信有内置/更好的方法来做到这一点。

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

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

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

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

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

于 2020-10-19T11:59:08.263 回答
1

Another approach I used - combine multis into TreeMap as soon as they come with .collect().in(TREE_MAP_SUPPLIER, MULTI_MAP_ACCUMULATOR)

于 2021-02-03T14:20:33.357 回答