java - Flux.groupBy() 后跟 Flux#next 不会对元素进行分组
问题描述
我观察到一种行为Flux#groupBy
,我不确定这是一个错误还是来自我对反应堆的误解。
我有一个Flux
要按公共字段分组的元素,然后只返回每个组的一个元素。我尝试过使用Flux#next
,但最终结果令人惊讶,因为我仍然得到了助焊剂的所有元素。
Bar bar1 = new Bar(UUID.randomUUID())
Bar bar2 = new Bar(UUID.randomUUID())
Flux.just(new Foo(bar1), new Foo(bar1), new Foo(bar2), new Foo(bar2))
.groupBy(foo -> foo.bar.id)
.doOnNext(flux -> System.out.println("Grouped flux with key: " + flux.key()))
.flatMap(Flux::next)
.collectList()
.block() # the final list here contains 4 elements
在上面的例子println
中被调用了 4 次,其中 key 被重复了两次:
Grouped flux with key: 8a7b9135-97ce-48d7-a084-97f1bd3b6648
Grouped flux with key: 8a7b9135-97ce-48d7-a084-97f1bd3b6648
Grouped flux with key: 4e174753-0e25-4659-87f9-524f8b0edaf8
Grouped flux with key: 4e174753-0e25-4659-87f9-524f8b0edaf8
替换代码flatMap
以使用Flux#collectList
而不是Flux#next
为我解决了这个问题:
Flux.just(new Foo(bar1), new Foo(bar1), new Foo(bar2), new Foo(bar2))
.groupBy(foo -> foo.bar.id)
.doOnNext(flux -> System.out.println("Grouped flux with key: " + flux.key()))
.flatMap(flux -> flux.collectList().map(list -> list.get(0)))
.collectList()
.block() # the final list here contains 2 elements
我希望这两个片段都能正常工作,但显然由于某种原因它们没有。这种行为的解释是什么?
谢谢!
解决方案
解释是next()
取消了开放组,因此在下面的元素groupBy
上再次看到 key1,但该键没有开放组。结果,它重新创建了一个组并将第二次出现的bar1
放入第二组。
由于collectList
没有取消组,因此 key1 和 key2 组都保持打开状态,并且groupBy
能够将传入Foo
的 s 分派到两个组中。
推荐阅读
- python - 显示导致测试失败的数组条目
- android - 如何通过启动我的应用程序的意图移动到 OPPO 的应用程序信息页面?
- selenium - python'lxml'解析html,通过xpath获取数据不起作用
- c - 如何使用 C 将信号从父进程发送到子进程?
- geolocation - 如何禁用鹦鹉操作系统中的所有定位服务?
- sql - SQL 存储过程 - 返回不同的数据类型
- javascript - 将 JQuery 插件集成到 datepicker
- java - 我想通过写入/读取文件获得最佳性能/解决方案
- java - 带有区域设置的数字格式给出错误的输出
- typo3 - 如何从详细信息视图返回同一页面?