1,just
Just将单个数据转换为发射那个数据的Observable。
例:
private void testJust(){
Observable.just(1,2,3,4,5,6)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
输出:
1
2
3
4
5
6
2.from
Fom将其它种类的对象和数据类型转换为Observable
例:
private void testFrom(){
Integer[] nums = new Integer[]{1,2,3,4,5};
Observable.from(nums)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
输出:
1
2
3
4
5
3,create
Create使用一个函数从头开始创建一个Observable
例:
private void testCreate(){
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
subscriber.onNext(5);
subscriber.onCompleted();
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
输出:
1
2
3
4
5
4,empty
Empty创建一个不发射任何数据但是正常终止的Observable
例:
private void testEmpty(){
Observable.empty()
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
System.out.println("onNext");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.out.println("onErr");
}
}, new Action0() {
@Override
public void call() {
System.out.println("onComplete");
}
});
}
输出:
onComplete
5,never
Never创建一个不发射数据也不终止的Observable
例:
private void testNever(){
Observable.never()
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
System.out.println("onNext");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.out.println("onErr");
}
}, new Action0() {
@Override
public void call() {
System.out.println("onComplete");
}
});
}
输出:
ps:没有输出
6,error
Error创建一个不发射数据以一个错误终止的Observable
例:
private void testError(){
Observable.error(new Exception("错误了"))
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
System.out.println("onNext");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
System.out.println("onErr:"+throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
System.out.println("onComplete");
}
});
}
输出:
onErr:错误了
7,timer
Timer创建一个Observable,它在一个给定的延迟后发射一个特殊的值。
例:
private void testTimer() {
Observable.timer(500, TimeUnit.MILLISECONDS,Schedulers.computation())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.e("TAG","onNext:" + aLong);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG","onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG","onComplete" );
}
});
}
输出:
10-28 08:55:04.140 3536-3557/tbw.eage.rxjava E/TAG: onNext:0
10-28 08:55:04.140 3536-3557/tbw.eage.rxjava E/TAG: onComplete
ps:特殊值是0L,哈哈~
8,interval
Interval创建一个按固定时间间隔发射整数序列的Observable
例:
private void testInterval() {
Observable.interval(2, TimeUnit.SECONDS, Schedulers.computation())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.e("TAG", "onNext:" + aLong);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG", "onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG", "onComplete");
}
});
}
输出:
10-28 09:01:12.920 3886-3902/tbw.eage.rxjava E/TAG: onNext:0
10-28 09:01:14.919 3886-3902/tbw.eage.rxjava E/TAG: onNext:1
10-28 09:01:16.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:2
10-28 09:01:18.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:3
10-28 09:01:20.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:4
10-28 09:01:22.919 3886-3902/tbw.eage.rxjava E/TAG: onNext:5
10-28 09:01:24.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:6
ps:每个2秒输出一个自增的数据
9,range
Range创建一个发射特定整数序列的Observable
例:
private void testRange(){
Observable.range(5,5)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.e("TAG", "onNext:" + integer);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG", "onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG", "onComplete");
}
});
}
输出:
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:5
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:6
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:7
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:8
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:9
10-28 09:04:38.010 4013-4013/? E/TAG: onComplete
ps:是包括开头5的
创建操作符常用的差不多就这些了
1,flatMap
FlatMap 将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的
Observable
例1:
private void testFlatMap() {
Observable.just("Hellon")
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(final String str) {
final StringBuffer sb = new StringBuffer(str);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
sb.append(" Rxjava");
}
}).start();
return Observable.just(sb.toString());
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String str) {
Log.e("TAG", "onNext:" + str);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG", "onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG", "onComplete");
}
});
}
输出:
10-28 09:18:47.475 4505-4505/tbw.eage.rxjava E/TAG: onNext:Hellon
10-28 09:18:47.475 4505-4505/tbw.eage.rxjava E/TAG: onComplete
ps:注意它的输出,输出的是Hellon,并非Hellon RxJava.因为我在flapMap进行耗时的线程(Thread.sleep()),我们可以
类比实际应用中的网络请求的结果,耗时的结果我们是无法继续向下传递的,如果我们想输出Hellon Rxjava应该如何
做呢?请看例2.
例2:private void testFlatMap() {
Observable.just("Hellon")
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(final String str) {
final PublishSubject<String> subject = PublishSubject.create();
final StringBuffer sb = new StringBuffer(str);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
sb.append(" Rxjava");
subject.onNext(sb.toString());
subject.onCompleted();
}
}).start();
return subject;
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String str) {
Log.e("TAG", "onNext:" + str);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG", "onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG", "onComplete");
}
});
}
输出:10-28 09:19:41.393 4648-4665/tbw.eage.rxjava E/TAG: onNext:Hellon Rxjava
10-28 09:19:41.393 4648-4665/tbw.eage.rxjava E/TAG: onComplete
ps:这样我们就输入了Hellon Rxjava,这也是flapMap常用的一个场景。PublishSubject如果使用请看RxJava学习篇之一:基础Observable,Observer,Single,Subject,Scheduler
2,map
Map对Observable发射的每一项数据应用一个函数,执行变换操作
例:
private void testMap(){
Observable.just("hellon rxjava")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s.toUpperCase();
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String str) {
Log.e("TAG", "onNext:" + str);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("TAG", "onErr:" + throwable.getMessage());
}
}, new Action0() {
@Override
public void call() {
Log.e("TAG", "onComplete");
}
});
}
输出:
10-28 09:30:34.636 4872-4872/tbw.eage.rxjava E/TAG: onNext:HELLON RXJAVA
10-28 09:30:34.636 4872-4872/tbw.eage.rxjava E/TAG: onComplete
3,buffer
Buffer定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一个值。
例1:
private void testBuffer() {
Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation())
.buffer(3)
.subscribe(new Action1<List<Long>>() {
@Override
public void call(List<Long> longs) {
for (Long item : longs) {
Log.e("TAG", "onNext:" + item);
}
Log.e("TAG", "onNext------------------------------");
}
});
}
输出:
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:0
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:1
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:2
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:3
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:4
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:5
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:6
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:7
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:8
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:9
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:10
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:11
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
ps:每次收集3个值
例2:
private void testBuffer() {
Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation())
.publish(new Func1<Observable<Long>, Observable<List<Long>>>() {
@Override
public Observable<List<Long>> call(Observable<Long> longObservable) {
return longObservable.buffer(Observable.interval(2,TimeUnit.SECONDS));
}
})
.subscribe(new Action1<List<Long>>() {
@Override
public void call(List<Long> longs) {
for (Long item : longs) {
Log.e("TAG", "onNext:" + item);
}
Log.e("TAG", "onNext------------------------------");
}
});
}
输出:
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext:60
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext:61
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:62
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:63
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:64
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:65
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:66
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:67
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:47.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:68
10-28 09:46:47.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
ps:每隔2秒收集一下数据(publish操作符后面会讲到)
4,groupBy
GroupBy将一个Observable分拆为一些Observables集合,它们中的每一个发射原始Observable的一个子序列
例:
private void testGroupBy() {
Observable.just(0, 1, 2, 3, 4, 5)
.groupBy(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer*1.0 % 2 == 0;
}
})
.flatMap(new Func1<GroupedObservable<Boolean, Integer>, Observable<Integer>>() {
@Override
public Observable<Integer> call(GroupedObservable<Boolean, Integer> groupedObservable) {
return groupedObservable.getKey() ? groupedObservable.take(0) : groupedObservable;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer i) {
Log.e("TAG", "onNext:" + i);
}
});
}
输出:
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:3
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:5
5,scan
Scan连续地对数据序列的每一项应用一个函数,然后连续发射结果
例:
private void testScan(){
Observable.just(1, 2, 3, 4, 5)
.scan(new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer sum, Integer item) {
return sum + item;
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
Log.e("TAG", "onNext:" + item);
}
@Override
public void onError(Throwable error) {
Log.e("TAG", "onErr:" + error.getMessage());
}
@Override
public void onCompleted() {
Log.e("TAG","Sequence complete.");
}
});
}
输出:
10-28 10:15:56.538 6201-6201/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:3
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:6
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:10
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:15
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: Sequence complete.
6,window
Window定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次发射一项数据
private void testWindow() {
Observable.just(1, 2, 3, 4, 5)
.window(2)
.take(1)
.flatMap(new Func1<Observable<Integer>, Observable<Integer>>() {
@Override
public Observable<Integer> call(Observable<Integer> integerObservable) {
return integerObservable;
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
Log.e("TAG", "onNext:" + item);
}
@Override
public void onError(Throwable error) {
Log.e("TAG", "onErr:" + error.getMessage());
}
@Override
public void onCompleted() {
Log.e("TAG", "Sequence complete.");
}
});
}
输出:
10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: onNext:2
10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: Sequence complete.
ps:可能还是看不懂window的用法。window和buffer类似都是缓存数据,不同的是buffer发射来自原始Observable
的数据包,而window发射的是Observables。buffer把缓存的数据封装成一个数据包(List),而window把缓存的数据
封装成一个observable。
变换操作符常用的差不多就这些了