当对每个元素的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定

问题描述 投票:0回答:1

在将一种排放物分解成多个项目后,我无法确定排放物如何分类。我有以下代码,请允许我在功能上进行解释。

  • 数据库中自上而下的内容结构为A 1:nB1:n C
  • 在此返回逻辑中,我们更改了上面的内容; A的正下方可以有多个B和/或C(解压后的B
  • 所有类型都从共享的父项Z扩展,该父项在重写的compareTo上实现自定义ComparableComparator,对每个子类的类型按唯一的递增int id排序(因此,对于BC,从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))

children列表将仅包含B,因为从未发生过解包(在enrichB步骤中)。此always在返回的列表中产生稳定的排序顺序:

[B0B1B2B3B4

当启用该行时,一个B被转换为多个Citems中的一个)。我会期望(或也许希望)将其作为输出发生:

[B0B1B2C1C2C3B4(B3已打开包装)

但是,我得到如下输出:

B0B1C1C2C3B2B4

B0C1C2C3B1B2B4

[B0B1B2B4C1C2C3

因此保留了“内部”的顺序,但是为什么“整体”的顺序变得不稳定?我的怀疑是因为flatMap将继续对enrichBtoList()-加法执行操作,并且由于解包比其他操作花费了更多(波动)时间,因此“插入” ”。

  1. 我的怀疑是正确的,还是我想念其他东西?
  2. 如何控制/阻止此流程以保持稳定的顺序?最好不要修改模型C以在其中包含Bid并更改使用的Comparator
java sorting observable rx-java
1个回答
0
投票

所以答案是使用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);
}
© www.soinside.com 2019 - 2024. All rights reserved.