首页 > 解决方案 > 根据 RxJava 中的下一个元素将 Flowable 拆分为多个组

问题描述

我有一个Flowable<String>返回一个巨大的带有背压的字符串列表。每个字符串可以是一个标题(组),也可以是一个列表项。标题从行首开始,项目前面有空格,例如:

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

我需要根据项目的 title: 将 origin 拆分Flowable为多个项目,其中第一个 flowable 有项目:FlowableFlowable<String> -> Flowable<Flowable<String>>

[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 方法来执行此操作?(当然,没有加载内存中的所有项目)。

标签: javarx-javarx-java2

解决方案


您可以使用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()你想要的。


推荐阅读