根据 RxJava 中的下一个元素将 Flowable 拆分为多个组

Split Flowable to multiple groups based on next element in RxJava

我有一个 Flowable<String>,其中 returns 一个巨大的字符串列表 back-pressure。每个字符串可以是一个标题(组)或一个列表项。标题从行首开始,项目前面有 white-spaces 例如:

Title-1
  item-1
  item-2
  item-3
Title-2
  item-1
  item-2
Title-3
  item-1

我需要根据项目标题将来源 Flowable 拆分为多个 Flowable 项目: Flowable<String> -> Flowable<Flowable<String>>,其中第一个 flowable 有项目:

[title-1.item-1, title-1.item-2, title-1.item-3]

第二个:[title-2.item-1, title-2.item-2]

第三个:[title-3.item-1].

我尝试使用 Flowable.groupBy() 但没有找到根据周围项目对项目进行分组的方法。

是否存在一些标准的 RxJava 方法来执行此操作? (当然,没有加载内存中的所有项目)。

您可以使用 Flowable.scan()。所以你会有这样的东西:

originalFloawble
    .scan("" to "" as Pair<String, String>) {prev, newIncome -> 
        if (newIncome is Title) newIncome to ""
        else prev.first to newIncome
    }
    .filter { (title, item) -> item.isNotEmpty() }
    .groupBy { it.first }
    .map { it.map { (title, item) -> "$title.$item" } }

您可以使用Flowable.scan()根据之前的构建值构建可流动对象的下一个值。用它来构建 "titel.item" 形式的条目。请参阅以下示例:

List<String> data = new ArrayList<String>();
data.add("Title-1");
data.add("  item-1");
data.add("  item-2");
data.add("  item-3");
data.add("Title-2");
data.add("  item-1");
data.add("  item-2");
data.add("Title-3");
data.add("  item-1");
    
Flowable<String> dataFlowable = Flowable.fromIterable(data);
Flowable<String> adjustedFlowable = dataFlowable.scan("", (a,b) -> {
    if (a.equals("")) {
        // it's the first loop
        return b;
    }
    if (!b.startsWith("  ")) {
        // it's a title
        return b;
    }
    // it's a list item, so build it
    String[] split = a.split("\.", -2);
    return split[0]+"."+(b.trim());
    }
);
adjustedFlowable.blockingSubscribe(it -> {
    System.out.println(it);
});

这将生成以下输出:

Title-1
Title-1.item-1
Title-1.item-2
Title-1.item-3
Title-2
Title-2.item-1
Title-2.item-2
Title-3
Title-3.item-1

如您所见,这些项目现在已添加了它们所属的标题。从那里你可以使用任何你想要的filter()groupBy()