我无法理解在 1 个排放被解包到多个项目后如何对排放进行排序。我有以下代码,请允许我从功能上解释一下。
- 数据库中自上而下的内容结构为
A
1:nB
1:nC
- 在这个返回逻辑中我们改变了上面的内容;一个
A
可以直接在下面有多个B
和/或C
(未打包的B
)< - 所有类型均从共享父级
Z
扩展,该父级在重写的 compareTo 上使用自定义Comparator
实现Comparable
按子类类型的唯一升序 int id 进行排序(因此对于B
和C
从 0 重新开始) - enrichB 根据某些类型元数据返回单个
B
或多个C
< - addChildrenToA 只是一个构建器 (.with)
private Observable<A> getChildren(final A a) {
final Observable<List<B>> bList = containerService.getBs(a)
.toSortedList();
final Observable<? extends List<? extends Z>> children = bList
.flatMapIterable(items -> items)
.flatMap(b -> enrichB(b))
.toList();
return Observable.zip(
Observable.just(A),
children,
this::addChildrenToA);
}
如果我删除这一行:
.flatMap(b -> enrichB(b))
子列表将仅包含B
,因为不会发生解包(在enrichB步骤中)。这总是在返回的列表中产生稳定的排序顺序:
B0
、B1
、B2
、B3
、B4
当我启用该行时,一个 B
会转换为多个 C
(其中一个项目)。我期望(或者可能希望)这会作为输出发生:
B0
、B1
、B2
、C1
、C2
、 >C3
、B4
(B3 已解压)
但是..我得到的输出例如:
B0
、B1
、C1
、C2
、C3
、B2
,B4
B0
、C1
、C2
、C3
、B1
、B2
,B4
B0
、B1
、B2
、B4
、C1
、 >C2
,C3
所以“内部”的排序被保留,但为什么“整体”的排序变得不稳定?我的怀疑是因为 flatMap 将继续对 enrichB 和 toList() 添加操作,并且由于展开需要更多时间(波动)它比其他操作“插入”在随机位置的时间要长。
- 我的怀疑是正确的还是我遗漏了其他内容?
- 如何控制/阻止此流程以保持稳定的秩序?最好没有脏东西,例如修改模型
C
以包含B
的 id 并更改使用的Comparator
。
最佳答案
所以答案是使用concatMap而不是 flatMap
。
private Observable<A> getChildren(final A a) {
final Observable<List<B>> bList = containerService.getBs(a)
.toSortedList();
final Observable<? extends List<? extends Z>> children = bList
.flatMapIterable(items -> items)
.concatMap(b -> enrichB(b))
.toList();
return Observable.zip(
Observable.just(A),
children,
this::addChildrenToA);
}
关于java - 当每个元素上的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61007973/