在将一种排放物分解成多个项目后,我无法确定排放物如何分类。我有以下代码,请允许我在功能上进行解释。
A
1:nB
1:n C
A
的正下方可以有多个B
和/或C
(解压后的B
)Z
扩展,该父项在重写的compareTo上实现自定义Comparable
的Comparator
,对每个子类的类型按唯一的递增int id排序(因此,对于B
和C
,从0重新开始)B
或多个C
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))
children列表将仅包含B
,因为从未发生过解包(在enrichB步骤中)。此always在返回的列表中产生稳定的排序顺序:
[B0
,B1
,B2
,B3
,B4
当启用该行时,一个B
被转换为多个C
(items中的一个)。我会期望(或也许希望)将其作为输出发生:
[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);
}