java - 根据 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 有项目:Flowable
Flowable<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 方法来执行此操作?(当然,没有加载内存中的所有项目)。
解决方案
您可以使用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()
你想要的。
推荐阅读
- c++ - 帮助理解复制构造函数
- excel - 如何在粘贴信息和签名后放置正文?
- java - 通过确保实体存在来更新实体的最佳方法是否是 Spring Data JPA 中 getOne() 和 save() 的组合?
- read-the-docs - 是否可以为我的文档创建讨论页面?
- java - 无法将数据写入服务器端的多个 Firestore 项目
- url - Alfresco V5.2 - 如何在实时搜索 webscript 中获取当前页面 url
- reactjs - 将对 DOM 元素的引用传递给 React
- sql-server-2012 - 将假期天数添加到日期之间
- java - 从 gitlab 克隆存储库后,intellij 无法识别我的 java 文件
- encryption - 使用椭圆曲线密码术加密数据