RxJava--Buffer,GroupBy 对比
Buffer
设定收集n个元素为一组,以下方代码为例,三个为一组,则当组满三个元素时,返回一次List数据 没组满三个元素时,如果调用onComplete,直接发送剩余元素,没调用onComplete,一直等待
PublishSubject<String> subject = PublishSubject.create();
Disposable disposable = subject
.buffer(3)//获取三个为一组发送
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(List<String> s) throws Exception {
StringBuilder content = new StringBuilder();
for (String index : s) {
content.append(index).append(",");
}
LogUtils.e("rxJavaBuffer==" + content);
}
});
subject.onNext("1");
subject.onNext("2");
subject.onNext("3");
subject.onNext("4");
subject.onNext("5");
subject.onNext("6");
subject.onNext("7");
subject.onNext("8");
subject.onNext("9");
subject.onNext("10");
subject.onComplete();
复制代码
GroupBy
很有意思的操作符。先将获取的元素分组(自己分配key),生成对应的GroupedObservable GroupedObservable有点类似HashMap,包含key(自己分配的)和元素 应该注意的是,当每组GroupedObservable首次订阅新的订阅者后,后续同组元素直接将数据发送给新的订阅者。看代码
PublishSubject<String> subject = PublishSubject.create();
Disposable disposable = subject
.groupBy(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
// ? 第一步。 数据分类,分配不同的key
if (Integer.valueOf(s) < 4) {
return "one";
} else if (Integer.valueOf(s) < 7) {
return "two";
}
if (Integer.valueOf(s) < 10) {
return "three";
}
return "other";
}
})
.subscribe(new Consumer<GroupedObservable<String, String>>() {
@Override
public void accept(GroupedObservable<String, String> sub) throws Exception {
// ? 第二步。 根据不同的key,绑定新的订阅者。
// 如果改组已经订阅了新的订阅者,直接发送给新的订阅者
LogUtils.e(sub.getKey());
switch (sub.getKey()) {
case "one":
sub.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
LogUtils.e("GroupedObservable==one" + s);
}
});
break;
case "two":
sub.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
LogUtils.e("GroupedObservable==two" + s);
}
});
break;
case "three":
sub.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
LogUtils.e("GroupedObservable==three" + s);
}
});
break;
default:
sub.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
LogUtils.e("GroupedObservable==other" + s);
}
});
break;
}
}
});
subject.onNext("1");
subject.onNext("2");
subject.onNext("3");
subject.onNext("4");
subject.onNext("5");
subject.onNext("6");
subject.onNext("7");
subject.onNext("8");
subject.onNext("9");
subject.onNext("10");
subject.onComplete();
复制代码
RxJava--Buffer,GroupBy 对比的更多相关文章
- Protocol Buffer序列化对比Java序列化.
初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...
- MySQL缓存之Qcache与buffer pool对比
Q:innodb buffer pool和Qcache的缓存区别? A: 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0 ...
- underscorejs-indexBy学习
2.19 indexBy 2.19.1 语法 _.indexBy(list, iteratee, [context]) 2.19.2 说明 给定一个list,和 一个用来返回一个在列表中的每个元素键 ...
- QuietHit小Game
根据项目的要求分别建出几个类 有游戏类 玩家类 测试类 等级类 等级时间类 一以下类图: 游戏类: public class Game { private Player player; public ...
- Netty精粹之玩转NIO缓冲区
摘要: 在JAVA NIO相关的组件中,ByteBuffer是除了Selector.Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写 ...
- OpenSource.SerializationLibrary
1. Cap'n Proto protocol buffer的主要作者之一创建的新项目.其主页描述Cap'n Proto的性能比PB快很多. http://kentonv.github.io/capn ...
- 转载 IO、文件、NIO【草案四】
本章目录: 1.IO类相关内容 2.文件和目录 3.文件高级操作 NIO详解[1]——缓冲区(Buffer)[深入理解,总结自<Java-NIO>]: [*:下边的Buffer又指代抽象 ...
- 【Java语言特性学习之一】设计模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- MySQL索引失效之隐式转换
常见索引失效: 1. 条件索引字段"不干净":函数操作.运算操作 2. 隐式类型转换:字符串转数值:其他类型转换 3. 隐式字符编码转换:按字符编码数据长度大的方向转换,避免数据截 ...
随机推荐
- MFC之TreeCtrl遍历所有节点
这个例子,主要是查找树上的某个节点,并展开选中它.采用来了递归方法来实现.主要用到的方法: CTreeCtrl::GetChildItemHTREEITEM GetChildItem( HTREEIT ...
- XSS编码问题的个人总结
XSS也太太太难了,主要也是因为自己没花时间集中. 文章脉络:根据我粗浅的理解,从开始学习XSS到现在,从一开始的见框就插到现在去学构造.编码,首先需要的是能看懂一些payload,然后再去深入理解. ...
- C++ delete报错解析
C++ delete报错 今天写了如下代码 #include <iostream> #include <algorithm> using namespace std; int ...
- 浅谈RPC与Http
什么是RPC,RPC原理是什么? 什么是RPC? RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比如两个 ...
- webpack4.0(01.基础配置和初识)
1.什么是webpack? 2.webpack可以做什莫? 代码转换.文件优化.代码分割.模块合并.自动刷新.代码校验.自动发布 3.我们要学习webpack的什么? 4.使用webpack 1.首先 ...
- awk线程号
for i in `ps|grep [a]out|awk '{print $1}'` do kill -9 "$i" done
- 如何配置多个Spring的xml配置文件(多模块配置)
如何使用多个Spring的xml配置文件(多模块配置) (2009-08-22 13:42:43) 如何使用多个Spring的xml配置文件(多模块配置) 在用Struts Spring Hibe ...
- 【Canvas】(2)---绘制折线图
绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...
- Jenkins 批量创建任务的三种方法
最近,要搭建多套测试环境,需要把 Jenkins 中 dev 视图下的所有任务批量复制到 sit 等视图下. 说明 Jenkins 任务名称规则为:[测试环境标识]-[工程名称],如:dev-daod ...
- 技术债务(Technical debt)的产生原因及衡量解决
第一次发布代码,就好比借了一笔钱.只要通过不断重写来偿还债务,小额负债可以加速开发.但久未偿还债务会引发危险.复用马马虎虎的代码,类似于负债的利息.整个部门有可能因为松散的实现,不完全的面向对象的设计 ...