Lambda Notation new Func1() { @Override public Integer call(String s) { return s.length(); } }; (String s) -> { return s.length(); } s -> s.length() …is the same as… …is the same as…
take(1) vs. first() • take(1) - emits once, or not at all Observable.empty().take(1) • first() - emits once, or crashes Observable.empty().first() crash! emits nothing
Observer observer = /* some Observer */ o1.subscribe(observer); o2.subscribe(observer); Subscriber subscriber = /* some Subscriber */ o1.subscribe(subscriber); o2.subscribe(subscriber); Versus Can blow up in your face
Debugging onError Exception in thread "RxCachedThreadScheduler-1" java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling. at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements at rx.Observable$26.onError(Observable.java:7881) at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:159) at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) at rx.internal.operators.OperatorSubscribeOn$1$1$1.onError(OperatorSubscribeOn.java:71) at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:131) at rx.internal.operators.OperatorTake$1.onCompleted(OperatorTake.java:53) at rx.Observable$EmptyHolder$1.call(Observable.java:1073) at rx.Observable$EmptyHolder$1.call(Observable.java:1070) at rx.Observable$2.call(Observable.java:162) at rx.Observable$2.call(Observable.java:154) at rx.Observable$2.call(Observable.java:162) at rx.Observable$2.call(Observable.java:154) at rx.Observable.unsafeSubscribe(Observable.java:8098) at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62) at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) ... 7 more Caused by: java.util.NoSuchElementException: Sequence contains no elements ... 18 more No references to my code!
Sharing • Wanted: Multiple subscribers retrofitRequest.subscribe(/* do a thing */); retrofitRequest.subscribe(/* do another thing */); • Bad: Duplicate expensive operations