rx-java - 类似的 take()&groupBy() 代码应用于 timer() 导致不同的结果
问题描述
learnrxjava repo ( https://github.com/jhusain/learnrxjava ) 中的以下两段代码产生不同的结果:
Observable.timer(0, 1, TimeUnit.MILLISECONDS)
.groupBy(n -> n % 2 == 0)
.flatMap(g -> {
return g.take(10).toList();
}).take(2).toBlocking().forEach(System.out::println);
和
Observable.timer(0, 1, TimeUnit.MILLISECONDS)
.take(20)
.groupBy(n -> n % 2 == 0)
.flatMap(g -> {
return g.toList();
})
.toBlocking()
.forEach(System.out::println);
产量
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
和
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
分别。我只是无法弄清楚为什么在第二种情况下结果会翻转。
谢谢。
解决方案
主要原因是take
在 groupBy 完成之前偶数组的内部强制信号。
GroupBy 在地图中保存两个组,它们具有false(奇数组)和true(偶数组)的自然顺序。
当源发出 18 时,真正的(偶数)组获取其所有 10 项并take
发出一个onCompleted
,完成列表,然后由 发出flatMap
。接下来,源发出 19 完成假(奇)组并执行相同的操作。
当没有 innertake
时,两个组都保持活动状态,直到源在 20 个项目后完成。完成后,首先groupBy
通知假(奇)组完成,然后首先发出奇数列表,然后真(偶)组完成,发出偶数列表。
推荐阅读
- c# - 如果 C# 项目具有 .Netframework 依赖项,是否可以将其构建为 .Netcore 应用程序
- android - Android Studio 3.5.2 离线设置错误:app@debug/compileClasspath
- php - DD 在嵌套的 foreach 循环中不起作用
- apache-camel - 如何在 Camel 中处理多个 CXF 端点?
- python-3.x - 基于3点的图像变换
- ios - UICollectionReusableView 中未调用委托
- android - 不同手机的Textview大小不同
- postgresql - 在同一无人机跑步机上同时运行同一管道多次时如何隔离无人机管道?
- python - 如何更改 Kedro 中 ParallelRunner 的进程数?
- yosys - yosys综合-for循环中的语法错误