├── .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 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 fun) { 20 | OperatorMap operatorMap = new OperatorMap<>(fun); 21 | //根据操作符生成新的Observable,并返回,以便实现链式操作 22 | return lift(operatorMap); 23 | 24 | } 25 | 26 | public interface OnAttach { 27 | void call(Observer 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 operator) { 37 | return new Observable<>(new OnAttach() { 38 | @Override 39 | public void call(Observer observer) { 40 | Observer observerConverted = operator.call(observer); 41 | Observable.this.onAttach.call(observerConverted); 42 | } 43 | }); 44 | } 45 | 46 | public Observable filter(IFun fun) { 47 | return lift(new OperatorFilter(fun)); 48 | } 49 | 50 | //1.操作符接口 51 | public interface Operator extends IFun, Observer> {} 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 fun; 5 | 6 | public OperatorFilter(IFun fun) { 7 | this.fun = fun; 8 | } 9 | 10 | @Override 11 | public Observer call(Observer 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 convert; 5 | 6 | public OperatorMap(IFun convert) { 7 | this.convert = convert; 8 | } 9 | 10 | @Override 11 | public Observer call(final Observer 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 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 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 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 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 transformer; 9 | 10 | public MapOnSubscribe(Observable source, Observable.Transformer transformer) { 11 | this.source = source; 12 | this.transformer = transformer; 13 | } 14 | 15 | @Override 16 | public void call(Subscriber 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 actual; 5 | final Observable.Transformer transformer; 6 | 7 | public MapSubscriber(Subscriber actual, Observable.Transformer 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 subscriber) { 19 | subscriber.onStart(); 20 | onSubscribe.call(subscriber); 21 | } 22 | 23 | // public Observable map(Transformer transformer) { 24 | // return create(new OnSubscribe() { // 生成一个桥接的Observable和 OnSubscribe 25 | // @Override 26 | // public void call(Subscriber 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 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 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 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 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 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 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 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 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 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 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 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 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 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 | --------------------------------------------------------------------------------