我最近开始使用Project Reactor,并且提出了一个似乎无法弄清的方案。
基本上,我想对某个流进行分组,然后获取诸如grouping key -> List of grouped values
之类的哈希映射。我一直在使用API,但是我获得的最远的要么是获取值,键,计数,要么不是我想要的数据结构。例如,这将是获取值的代码:
var elements = new ArrayList<Integer>();
Flux.just(-1, -2, -3, 1, 2, 3)
.groupBy(val -> val.compareTo(0))
.flatMap(Flux::collectList)
.subscribe(elements::addAll);
我要通过的测试如下:
@Test
public void groupBy() {
var elements = new HashMap<Integer, List<Integer>>();
Flux.just(-1, -2, -3, 1, 2, 3)
.groupBy(val -> val.compareTo(0))
// Do something here ...
.subscribe(...);
assertThat(elements).containsKeys(-1, 1);
assertThat(elements.get(-1)).containsExactly(-1, -2, -3);
assertThat(elements.get(1)).containsExactly(1, 2, 3);
}
我如何实现后者?
答案 0 :(得分:1)
您是否考虑过使用Flux#connect?它接受Collector
与Stream
使用的相同类型。还有Flux#collectMap
。
此外,如果您需要流这样的地图,可以使用Flux#scan。
groupBy
在需要按键“路由”信号并按键有Flux
时很有用,但它并非设计用于创建数据集合。