根据 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()
。
我有一个 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()
。