├── .idea
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
├── uiDesigner.xml
└── vcs.xml
├── RxJavaFrame.iml
├── lib
└── rxjava-1.1.10.jar
├── raw
└── graph.jpg
└── src
├── frame
├── Client.java
├── IFun.java
├── Observable.java
├── Observer.java
├── OperatorFilter.java
└── OperatorMap.java
├── my_rxjava
├── Main.java
├── MapOnSubscribe.java
├── MapSubscriber.java
├── Observable.java
├── Observer.java
├── Scheduler.java
├── Schedulers.java
└── Subscriber.java
└── operator
├── ErrorHandling
├── Catch.java
└── Retry.java
├── combine
├── CombineLast.java
├── Merge.java
└── Zip.java
├── create
└── Defer$from$repeat.java
├── filter
├── Debounce.java
├── Distinct.java
└── Filter$ElementAt.java
└── transform
├── Buffer.java
├── FlatMap.java
├── GroupBy.java
├── Scan.java
└── Window.java
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/RxJavaFrame.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/lib/rxjava-1.1.10.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TellH/RxJavaDemo/3111bf46a4b3bfb701e17b1d7bd73a540a20b3cc/lib/rxjava-1.1.10.jar
--------------------------------------------------------------------------------
/raw/graph.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TellH/RxJavaDemo/3111bf46a4b3bfb701e17b1d7bd73a540a20b3cc/raw/graph.jpg
--------------------------------------------------------------------------------
/src/frame/Client.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public class Client {
4 | public static void main(String[] args) {
5 |
6 | //注册关系,简化了手动通知观察者的过程
7 | Observable.OnAttach onAttach0 = new Observable.OnAttach() {
8 | @Override
9 | public void call(Observer super String> observer) {
10 | observer.update("test");
11 | }
12 | };
13 |
14 | //被观察者
15 | Observable observable0 = Observable.create(onAttach0);
16 |
17 | Observable observable1 = observable0.map(new IFun() {
18 |
19 | @Override
20 | public String call(String s) {
21 | return s + "_0to1";
22 | }
23 | });
24 |
25 | Observable observable2 = observable1.map(new IFun() {
26 |
27 | @Override
28 | public String call(String s) {
29 | return s + "_1to2";
30 | }
31 | });
32 |
33 | //观察者
34 | Observer observer0 = new Observer() {
35 | @Override
36 | public void update(String t) {
37 | System.out.println(t);
38 | }
39 | };
40 |
41 | //将观察者注册到被观察者上
42 | observable2.attach(observer0);
43 |
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/frame/IFun.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public interface IFun {
4 | R call(T t);
5 | }
--------------------------------------------------------------------------------
/src/frame/Observable.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public class Observable {
4 | protected OnAttach onAttach;
5 |
6 | public Observable(OnAttach onAttach) {
7 | this.onAttach = onAttach;
8 | }
9 |
10 | public static Observable create(OnAttach onAttach) {
11 | return new Observable<>(onAttach);
12 | }
13 |
14 |
15 | public void attach(Observer observer) {
16 | onAttach.call(observer);
17 | }
18 |
19 | public Observable map(IFun super T, ? extends R> fun) {
20 | OperatorMap operatorMap = new OperatorMap<>(fun);
21 | //根据操作符生成新的Observable,并返回,以便实现链式操作
22 | return lift(operatorMap);
23 |
24 | }
25 |
26 | public interface OnAttach {
27 | void call(Observer super T> observer);
28 | }
29 |
30 | //重点,该方法的实现了方法链.
31 | //用Operator实现Observer的转化
32 | //将OnAttach事件传递下去。
33 | //当到了最初那个Observable的OnAttach时,才调用Observer的update,进行数据流的转化
34 | //因为中间的Observer是在Operator的call方法中创建的,在这些Observer的update方法中进行数据流的转化
35 | //并回调call方法参数中的Observer的update方法,将数据传递下去,最终传到最开始订阅传进去的那个Observer。
36 | public Observable lift(final Operator extends R, ? super T> operator) {
37 | return new Observable<>(new OnAttach() {
38 | @Override
39 | public void call(Observer super R> observer) {
40 | Observer super T> observerConverted = operator.call(observer);
41 | Observable.this.onAttach.call(observerConverted);
42 | }
43 | });
44 | }
45 |
46 | public Observable filter(IFun super T, Boolean> fun) {
47 | return lift(new OperatorFilter(fun));
48 | }
49 |
50 | //1.操作符接口
51 | public interface Operator extends IFun, Observer super T>> {}
52 |
53 | }
--------------------------------------------------------------------------------
/src/frame/Observer.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public interface Observer {
4 | void update(T t);
5 | }
--------------------------------------------------------------------------------
/src/frame/OperatorFilter.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public class OperatorFilter implements Observable.Operator {
4 | private IFun super T, Boolean> fun;
5 |
6 | public OperatorFilter(IFun super T, Boolean> fun) {
7 | this.fun = fun;
8 | }
9 |
10 | @Override
11 | public Observer super T> call(Observer super T> observer) {
12 | return new Observer() {
13 | @Override
14 | public void update(T t) {
15 | if (fun.call(t)) {
16 | observer.update(t);
17 | }
18 |
19 | }
20 | };
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/frame/OperatorMap.java:
--------------------------------------------------------------------------------
1 | package frame;
2 |
3 | public class OperatorMap implements Observable.Operator {
4 | private IFun super T,? extends R> convert;
5 |
6 | public OperatorMap(IFun super T, ? extends R> convert) {
7 | this.convert = convert;
8 | }
9 |
10 | @Override
11 | public Observer super T> call(final Observer super R> observer) {
12 | return new Observer() {
13 | @Override
14 | public void update(T t) {
15 | observer.update(convert.call(t));
16 |
17 | }
18 | };
19 | }
20 | }
--------------------------------------------------------------------------------
/src/my_rxjava/Main.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | /**
4 | * Created by tlh on 2017/5/9.
5 | */
6 | public class Main {
7 | public static void main(String[] args) {
8 | Observable.create(new Observable.OnSubscribe() {
9 | @Override
10 | public void call(Subscriber super Integer> subscriber) {
11 | for (int i = 0; i < 10; i++) {
12 | subscriber.onNext(i);
13 | }
14 | }
15 | }).subscribe(new Subscriber() {
16 | @Override
17 | public void onCompleted() {
18 |
19 | }
20 |
21 | @Override
22 | public void onError(Throwable t) {
23 |
24 | }
25 |
26 | @Override
27 | public void onNext(Integer var1) {
28 | System.out.println(var1);
29 | }
30 | });
31 |
32 | Observable.create(new Observable.OnSubscribe() {
33 | @Override
34 | public void call(Subscriber super Integer> subscriber) {
35 | for (int i = 0; i < 10; i++) {
36 | subscriber.onNext(i);
37 | }
38 | }
39 | }).map(new Observable.Transformer() {
40 | @Override
41 | public String call(Integer from) {
42 | return "maping " + from;
43 | }
44 | }).subscribe(new SimpleSubscriber() {
45 | @Override
46 | public void onNext(String var1) {
47 | System.out.println(var1);
48 | }
49 | });
50 |
51 | Observable.create(new Observable.OnSubscribe() {
52 | @Override
53 | public void call(Subscriber super Integer> subscriber) {
54 | System.out.println("OnSubscribe@ " + Thread.currentThread().getName());
55 | subscriber.onNext(1);
56 | }
57 | })
58 | .subscribeOn(Schedulers.io())
59 | .subscribe(new SimpleSubscriber() {
60 | @Override
61 | public void onNext(Integer var1) {
62 | System.out.println("Subscriber@ " + Thread.currentThread().getName());
63 | System.out.println(var1);
64 | }
65 | });
66 | Observable.create(new Observable.OnSubscribe() {
67 | @Override
68 | public void call(Subscriber super Integer> subscriber) {
69 | System.out.println("OnSubscribe@ " + Thread.currentThread().getName());
70 | subscriber.onNext(1);
71 | }
72 | })
73 | .observeOn(Schedulers.io())
74 | .subscribe(new SimpleSubscriber() {
75 | @Override
76 | public void onNext(Integer var1) {
77 | System.out.println("Subscriber@ " + Thread.currentThread().getName());
78 | System.out.println(var1);
79 | }
80 | });
81 | }
82 |
83 | private abstract static class SimpleSubscriber extends Subscriber {
84 |
85 | @Override
86 | public void onCompleted() {
87 |
88 | }
89 |
90 | @Override
91 | public void onError(Throwable t) {
92 |
93 | }
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/src/my_rxjava/MapOnSubscribe.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | /**
4 | * Created by tlh on 2017/5/9.
5 | */
6 | public class MapOnSubscribe implements Observable.OnSubscribe {
7 | final Observable source;
8 | final Observable.Transformer super T, ? extends R> transformer;
9 |
10 | public MapOnSubscribe(Observable source, Observable.Transformer super T, ? extends R> transformer) {
11 | this.source = source;
12 | this.transformer = transformer;
13 | }
14 |
15 | @Override
16 | public void call(Subscriber super R> subscriber) {
17 | source.subscribe(new MapSubscriber(subscriber, transformer));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/my_rxjava/MapSubscriber.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | public class MapSubscriber extends Subscriber {
4 | final Subscriber super T> actual;
5 | final Observable.Transformer super R, ? extends T> transformer;
6 |
7 | public MapSubscriber(Subscriber super T> actual, Observable.Transformer super R, ? extends T> transformer) {
8 | this.actual = actual;
9 | this.transformer = transformer;
10 | }
11 |
12 | @Override
13 | public void onCompleted() {
14 | actual.onCompleted();
15 | }
16 |
17 | @Override
18 | public void onError(Throwable t) {
19 | actual.onError(t);
20 | }
21 |
22 | @Override
23 | public void onNext(R var1) {
24 | actual.onNext(transformer.call(var1));
25 | }
26 | }
--------------------------------------------------------------------------------
/src/my_rxjava/Observable.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 |
4 | /**
5 | * Created by tlh on 2017/5/9.
6 | */
7 | public class Observable {
8 | final OnSubscribe onSubscribe;
9 |
10 | private Observable(OnSubscribe onSubscribe) {
11 | this.onSubscribe = onSubscribe;
12 | }
13 |
14 | public static Observable create(OnSubscribe onSubscribe) {
15 | return new Observable(onSubscribe);
16 | }
17 |
18 | public void subscribe(Subscriber super T> subscriber) {
19 | subscriber.onStart();
20 | onSubscribe.call(subscriber);
21 | }
22 |
23 | // public Observable map(Transformer super T, ? extends R> transformer) {
24 | // return create(new OnSubscribe() { // 生成一个桥接的Observable和 OnSubscribe
25 | // @Override
26 | // public void call(Subscriber super R> subscriber) {
27 | // Observable.this.subscribe(new Subscriber() { // 订阅上层的Observable
28 | // @Override
29 | // public void onCompleted() {
30 | // subscriber.onCompleted();
31 | // }
32 | //
33 | // @Override
34 | // public void onError(Throwable t) {
35 | // subscriber.onError(t);
36 | // }
37 | //
38 | // @Override
39 | // public void onNext(T var1) {
40 | // // 将上层的onSubscribe发送过来的Event,通过转换和处理,转发给目标的subscriber
41 | // subscriber.onNext(transformer.call(var1));
42 | // }
43 | // });
44 | // }
45 | // });
46 | // }
47 |
48 | public Observable map(Transformer super T, ? extends R> transformer) {
49 | return create(new MapOnSubscribe(this, transformer));
50 | }
51 |
52 | public Observable subscribeOn(Scheduler scheduler) {
53 | return Observable.create(new OnSubscribe() {
54 | @Override
55 | public void call(Subscriber super T> subscriber) {
56 | subscriber.onStart();
57 | // 将事件生产切换到新的线程
58 | scheduler.createWorker().schedule(new Runnable() {
59 | @Override
60 | public void run() {
61 | Observable.this.onSubscribe.call(subscriber);
62 | }
63 | });
64 | }
65 | });
66 | }
67 |
68 | public Observable observeOn(Scheduler scheduler) {
69 | return Observable.create(new OnSubscribe() {
70 | @Override
71 | public void call(Subscriber super T> subscriber) {
72 | subscriber.onStart();
73 | Scheduler.Worker worker = scheduler.createWorker();
74 | Observable.this.onSubscribe.call(new Subscriber() {
75 | @Override
76 | public void onCompleted() {
77 | worker.schedule(new Runnable() {
78 | @Override
79 | public void run() {
80 | subscriber.onCompleted();
81 | }
82 | });
83 | }
84 |
85 | @Override
86 | public void onError(Throwable t) {
87 | worker.schedule(new Runnable() {
88 | @Override
89 | public void run() {
90 | subscriber.onError(t);
91 | }
92 | });
93 | }
94 |
95 | @Override
96 | public void onNext(T var1) {
97 | worker.schedule(new Runnable() {
98 | @Override
99 | public void run() {
100 | subscriber.onNext(var1);
101 | }
102 | });
103 | }
104 | });
105 | }
106 | });
107 | }
108 |
109 | public interface OnSubscribe {
110 | void call(Subscriber super T> subscriber);
111 | }
112 |
113 | public interface Transformer {
114 | R call(T from);
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/src/my_rxjava/Observer.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | public interface Observer {
4 | void onCompleted();
5 |
6 | void onError(Throwable t);
7 |
8 | void onNext(T var1);
9 | }
--------------------------------------------------------------------------------
/src/my_rxjava/Scheduler.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | import java.util.concurrent.Executor;
4 |
5 | /**
6 | * Created by tlh on 2017/5/9.
7 | */
8 | public class Scheduler {
9 | final Executor executor;
10 |
11 | public Scheduler(Executor executor) {
12 | this.executor = executor;
13 | }
14 |
15 | public Worker createWorker() {
16 | return new Worker(executor);
17 | }
18 |
19 | public static class Worker {
20 | final Executor executor;
21 |
22 | public Worker(Executor executor) {
23 | this.executor = executor;
24 | }
25 |
26 | public void schedule(Runnable runnable) {
27 | executor.execute(runnable);
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/my_rxjava/Schedulers.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | import java.util.concurrent.Executors;
4 |
5 | /**
6 | * Created by tlh on 2017/5/9.
7 | */
8 | public class Schedulers {
9 | private static final Scheduler ioScheduler = new Scheduler(Executors.newSingleThreadExecutor());
10 |
11 | public static Scheduler io() {
12 | return ioScheduler;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/my_rxjava/Subscriber.java:
--------------------------------------------------------------------------------
1 | package my_rxjava;
2 |
3 | /**
4 | * Created by tlh on 2017/5/9.
5 | */
6 | public abstract class Subscriber implements Observer {
7 | public void onStart() {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/operator/ErrorHandling/Catch.java:
--------------------------------------------------------------------------------
1 | package operator.ErrorHandling;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 |
6 | /**
7 | * Created by tlh on 2016/8/9.
8 | */
9 | public class Catch {
10 | private static Observable onErrorReturnObserver() {
11 | return createObserver().onErrorReturn(throwable -> "An error has bean caught.");
12 | }
13 |
14 | private static Observable onErrorResumeNextObserver() {
15 | return createObserver().onErrorResumeNext(Observable.just("7", "8", "9"));
16 | }
17 |
18 | private static Observable createObserver() {
19 | return Observable.create(new Observable.OnSubscribe() {
20 | @Override
21 | public void call(Subscriber super String> subscriber) {
22 | for (int i = 1; i <= 6; i++) {
23 | if (i < 3) {
24 | subscriber.onNext("onNext:" + i);
25 | } else {
26 | subscriber.onError(new Throwable("Throw error"));
27 | }
28 | }
29 | }
30 | });
31 | }
32 |
33 | public static void main(String[] args) {
34 | // onErrorReturnObserver()
35 | onErrorResumeNextObserver()
36 | .subscribe(System.out::println);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/operator/ErrorHandling/Retry.java:
--------------------------------------------------------------------------------
1 | package operator.ErrorHandling;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 | import rx.functions.Func1;
6 |
7 | import java.util.concurrent.TimeUnit;
8 |
9 | /**
10 | * Created by tlh on 2016/8/9.
11 | */
12 | public class Retry {
13 | private static Observable retryObserver() {
14 | return createObserver().retry(2);
15 | }
16 |
17 | private static Observable retryWhenObserver() {
18 | // createObserver().retryWhen(new Func1, Observable>>() {
19 | // @Override
20 | // public Observable> call(Observable extends Throwable> observable) {
21 | // return observable.zipWith(Observable.just(1, 2, 3),
22 | // (throwable, integer) -> throwable.getMessage() + integer)
23 | // .flatMap(throwableMsg -> {
24 | // System.out.println(throwableMsg);
25 | // return Observable.timer(1, TimeUnit.SECONDS);
26 | // });
27 | // }
28 | // });
29 | return createObserver().retryWhen(observable -> observable.zipWith(Observable.just(1, 2, 3),
30 | (throwable, integer) -> throwable.getMessage() + integer)
31 | .flatMap(throwableStr -> {
32 | System.out.println(throwableStr);
33 | return Observable.empty();
34 | }));
35 | }
36 |
37 | private static Observable createObserver() {
38 | return Observable.create(new Observable.OnSubscribe() {
39 | @Override
40 | public void call(Subscriber super Integer> subscriber) {
41 | System.out.println("subscribe");
42 | for (int i = 0; i < 3; i++) {
43 | if (i == 2) {
44 | subscriber.onError(new Exception("Exception-"));
45 | } else {
46 | subscriber.onNext(i);
47 | }
48 | }
49 | }
50 | });
51 | }
52 |
53 | public static void main(String[] args) {
54 | retryWhenObserver().subscribe(System.out::println);
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/operator/combine/CombineLast.java:
--------------------------------------------------------------------------------
1 | package operator.combine;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | /**
10 | * Created by tlh on 2016/8/9.
11 | */
12 | public class CombineLast {
13 | private static Observable createObserver(int index) {
14 | return Observable.create(new Observable.OnSubscribe() {
15 | @Override
16 | public void call(Subscriber super Integer> subscriber) {
17 | for (int i = 1; i < 6; i++) {
18 | subscriber.onNext(i * index);
19 | try {
20 | Thread.sleep(500);
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 | });
27 | }
28 |
29 | private static Observable combineLatestObserver() {
30 | return Observable.combineLatest(createObserver(1), createObserver(2), (num1, num2) -> {
31 | System.out.println("left:" + num1 + " right:" + num2);
32 | return num1 + num2;
33 | });
34 | }
35 |
36 |
37 | private static Observable combineListObserver() {
38 | List> list = new ArrayList<>();
39 | for (int i = 1; i < 5; i++) {
40 | list.add(createObserver(i));
41 | }
42 | return Observable.combineLatest(list, args -> {
43 | int temp = 0;
44 | for (Object i : args) {
45 | temp += (Integer) i;
46 | }
47 | return temp;
48 | });
49 | }
50 | public static void main(String[] args) {
51 | combineListObserver()
52 | .subscribe(System.out::println);
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/operator/combine/Merge.java:
--------------------------------------------------------------------------------
1 | package operator.combine;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 |
6 | /**
7 | * Created by tlh on 2016/8/9.
8 | */
9 | public class Merge {
10 | private static Observable mergeObserver() {
11 | return Observable.merge(Observable.just(1, 2, 3), Observable.just(4, 5, 6));
12 | }
13 |
14 | private static Observable mergeDelayErrorObserver() {
15 | return Observable.mergeDelayError(Observable.create(new Observable.OnSubscribe() {
16 | @Override
17 | public void call(Subscriber super Integer> subscriber) {
18 | for (int i = 0; i < 5; i++) {
19 | if (i == 3) {
20 | subscriber.onError(new Throwable("error"));
21 | }
22 | subscriber.onNext(i);
23 | }
24 | }
25 | }), Observable.create(new Observable.OnSubscribe() {
26 | @Override
27 | public void call(Subscriber super Integer> subscriber) {
28 | for (int i = 0; i < 5; i++) {
29 | subscriber.onNext(5 + i);
30 | }
31 | subscriber.onCompleted();
32 | }
33 | }));
34 | }
35 |
36 | public static void main(String[] args) {
37 |
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/operator/combine/Zip.java:
--------------------------------------------------------------------------------
1 | package operator.combine;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 |
6 | /**
7 | * Created by tlh on 2016/8/9.
8 | */
9 | public class Zip {
10 | private Observable zipWithObserver() {
11 | return createObserver(2).zipWith(createObserver(3), (s1, s2) -> s1 + "-" + s2);
12 | }
13 |
14 | private Observable zipWithIterableObserver() {
15 | return Observable
16 | .zip(createObserver(2), createObserver(3), createObserver(4), (s1, s2, s3) -> s1 + "-" + s2 + "-" + s3);
17 | }
18 |
19 | private Observable createObserver(int index) {
20 | return Observable.create(new Observable.OnSubscribe() {
21 | @Override
22 | public void call(Subscriber super String> subscriber) {
23 | for (int i = 1; i <= index; i++) {
24 | System.out.println("emitted:" + index + "-" + i);
25 | subscriber.onNext(index + "-" + i);
26 | try {
27 | Thread.sleep(500);
28 | } catch (InterruptedException e) {
29 | e.printStackTrace();
30 | }
31 | }
32 | }
33 | });
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/operator/create/Defer$from$repeat.java:
--------------------------------------------------------------------------------
1 | package operator.create;
2 |
3 |
4 | import rx.Observable;
5 |
6 | /**
7 | * Created by tlh on 2016/8/8.
8 | *
9 | */
10 | public class Defer$from$repeat {
11 | public static void main(String[] args) {
12 | Observable.defer(Defer$from$repeat::loadingData).subscribe(System.out::println);
13 | }
14 |
15 | private static Observable loadingData() {
16 | String[] data={"a","b","c"};
17 | try {
18 | Thread.sleep(2000);
19 | return Observable.from(data).repeat(5);
20 | } catch (InterruptedException e) {
21 | e.printStackTrace();
22 | }
23 | return null;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/operator/filter/Debounce.java:
--------------------------------------------------------------------------------
1 | package operator.filter;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 |
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by tlh on 2016/8/9.
10 | */
11 | public class Debounce {
12 | public static void main(String[] args) {
13 | // throttleWithTimeout();
14 | Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).debounce(integer -> {
15 | return Observable.create(new Observable.OnSubscribe() {
16 | @Override
17 | public void call(Subscriber super Integer> subscriber) {
18 | if (integer % 2 == 0 && !subscriber.isUnsubscribed()) {
19 | // System.out.println("complete:" + integer);
20 | // subscriber.onNext(integer);
21 | subscriber.onCompleted();
22 | }
23 | else System.out.println("filter" + integer);
24 | }
25 | });
26 | }).subscribe(System.out::println);
27 | }
28 |
29 | private static void throttleWithTimeout() {
30 | Observable.create(new Observable.OnSubscribe() {
31 | @Override
32 | public void call(Subscriber super Integer> subscriber) {
33 | for (int i = 0; i < 10; i++) {
34 | if (!subscriber.isUnsubscribed()) {
35 | subscriber.onNext(i);
36 | }
37 | int sleep = 199;
38 | if (i == 3) {
39 | sleep = 300;
40 | }
41 | try {
42 | Thread.sleep(sleep);
43 | } catch (InterruptedException e) {
44 | e.printStackTrace();
45 | }
46 | }
47 | subscriber.onCompleted();
48 | }
49 | }).throttleWithTimeout(200, TimeUnit.MILLISECONDS).subscribe(System.out::println);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/operator/filter/Distinct.java:
--------------------------------------------------------------------------------
1 | package operator.filter;
2 |
3 | import rx.Observable;
4 |
5 | /**
6 | * Created by tlh on 2016/8/9.
7 | */
8 | public class Distinct {
9 | public static void main(String[] args) {
10 | // distinct();
11 | Observable.just(1, 2, 3, 4, 5, 4, 3, 1, 1,11).distinctUntilChanged().subscribe(System.out::println);
12 | }
13 |
14 | private static void distinct() {
15 | Observable.just(1, 2, 3, 4, 5, 4, 3, 1, 1,11).distinct().subscribe(System.out::println);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/operator/filter/Filter$ElementAt.java:
--------------------------------------------------------------------------------
1 | package operator.filter;
2 |
3 | import rx.Observable;
4 | import rx.functions.Func1;
5 |
6 | /**
7 | * Created by tlh on 2016/8/9.
8 | */
9 | public class Filter$ElementAt {
10 | public static void main(String[] args) {
11 | Observable.just(0, 1, 2, 3, 4, 5).elementAt(2).subscribe(System.out::println);
12 | Observable.just(0, 1, 2, 3, 4, 5).filter(integer -> integer > 3)
13 | .subscribe(System.out::println);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/operator/transform/Buffer.java:
--------------------------------------------------------------------------------
1 | package operator.transform;
2 |
3 | import rx.Observable;
4 |
5 | import java.util.List;
6 | import java.util.concurrent.TimeUnit;
7 |
8 | /**
9 | * Created by tlh on 2016/8/9.
10 | */
11 | public class Buffer {
12 | private static Observable> bufferObserver() {
13 | return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).buffer(2, 3);
14 | }
15 |
16 |
17 | public static void main(String[] args) {
18 | bufferObserver().subscribe(System.out::println);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/operator/transform/FlatMap.java:
--------------------------------------------------------------------------------
1 | package operator.transform;
2 |
3 | import rx.Observable;
4 | import rx.exceptions.Exceptions;
5 | import rx.functions.Action1;
6 | import rx.functions.Func0;
7 | import rx.functions.Func1;
8 | import rx.observables.GroupedObservable;
9 |
10 | import java.util.ArrayList;
11 |
12 | /**
13 | * Created by tlh on 2016/8/9.
14 | */
15 | public class FlatMap {
16 | public static void main(String[] args) {
17 | // flatMapSimple();
18 | // flatMapComplete();
19 | // flatMapIterable();
20 | map();
21 | }
22 |
23 | private static void map() {
24 | Observable.just(1, 2, 3, 4, 5)
25 | .map(integer -> "map:" + integer)
26 | .subscribe(System.out::println);
27 | }
28 |
29 | private static void flatMapIterable() {
30 | Observable.just(1, 2, 3, 4, 5).flatMapIterable(integer -> {
31 | ArrayList arrayList = new ArrayList<>();
32 | for (int i = 0; i < integer; i++)
33 | arrayList.add(integer);
34 | return arrayList;
35 | }).subscribe(System.out::println);
36 | }
37 |
38 | private static void flatMapSimple() {
39 | Observable.just(1, 2, 3, 4, 5).flatMap(integer -> Observable.just("FlatMap:" + integer))
40 | .subscribe(System.out::println);
41 | }
42 |
43 | private static void flatMapComplete() {
44 | Observable.just(1, 2, 3, 4, 5)
45 | .flatMap(integer -> {
46 | if (integer == 3) throw new RuntimeException(String.valueOf(integer));
47 | return Observable.just("FlatMap:" + integer);
48 | })
49 | .flatMap(Observable::just,
50 | throwable -> Observable.just("Error:" + throwable.getMessage()),
51 | (Func0>) () -> null
52 | )
53 | .subscribe(System.out::println);
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/operator/transform/GroupBy.java:
--------------------------------------------------------------------------------
1 | package operator.transform;
2 |
3 | import rx.Observable;
4 | import rx.functions.Action1;
5 | import rx.functions.Func1;
6 | import rx.observables.GroupedObservable;
7 |
8 | /**
9 | * Created by tlh on 2016/8/9.
10 | */
11 | public class GroupBy {
12 | public static void main(String[] args) {
13 | Observable.just(1, 2, 3, 4, 5)
14 | .groupBy(integer -> integer % 2 == 0)
15 | .subscribe(groupedObservable -> {
16 | if (groupedObservable.getKey() == Boolean.TRUE)
17 | groupedObservable.subscribe(integer -> {
18 | System.out.println("偶数:" + integer);
19 | });
20 | else groupedObservable.subscribe(integer -> {
21 | System.out.println("奇数:" + integer);
22 | });
23 | // groupedObservable.count().subscribe(integer -> {
24 | // System.out.println(groupedObservable.getKey() + " contains " + integer + "members");
25 | // });
26 | });
27 |
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/operator/transform/Scan.java:
--------------------------------------------------------------------------------
1 | package operator.transform;
2 |
3 | import rx.Observable;
4 | import rx.Subscriber;
5 | import rx.functions.Func2;
6 |
7 | /**
8 | * Created by tlh on 2016/8/9.
9 | */
10 | public class Scan {
11 | public static void main(String[] args) {
12 | Observable.just(1, 2, 3, 4, 5)
13 | .scan(new Func2() {
14 | @Override
15 | public Integer call(Integer sum, Integer item) {
16 | return sum + item;
17 | }
18 | }).subscribe(System.out::println);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/operator/transform/Window.java:
--------------------------------------------------------------------------------
1 | package operator.transform;
2 |
3 | import rx.Observable;
4 | import rx.functions.Action1;
5 |
6 | /**
7 | * Created by tlh on 2016/8/9.
8 | */
9 | public class Window {
10 | public static void main(String[] args) {
11 | Observable.just(1, 2, 3, 4, 5, 6)
12 | .window(3)
13 | .subscribe(observable -> {
14 | System.out.println("new window:");
15 | observable.subscribe(System.out::println);
16 | });
17 | }
18 | }
19 |
--------------------------------------------------------------------------------