Chapter 1, Thinking Reactively, covers a brief history of Reactive Extensions and RxJava, and describes how to set up your first RxJava project and build your first reactive application. It also touches on the differences between RxJava 1.x, 2.x, and 3.0.
Chapter 2, Observable and Observer, provides the foundation for the following presentation of RxJava by introducing the two main terms Observable and Observer. It also presents the Observable specializations of Single, Completable, Maybe, and Disposable.
Chapter 3, Basic Operators, presents the basic RxJava operators. This is necessary for understanding the more complex operators described in the chapters that follow.
Chapter 4, Combining Observables, starts the transition from making RxJava useful to making it powerful. It covers the operators that allow several source observables to be combined into one resulting Observable.
Chapter 5, Multicasting, Replaying, and Caching, explains what multicasting is, and how to replay and cache emissions. It also presents how to use the Subject object and automatic connections.
Chapter 6, Concurrency and Parallelization, explores more of the nuances of RxJava and how to effectively leverage concurrency.
Chapter 7, Switching, Throttling, Windowing, and Buffering, explains and demonstrates the buffering, windowing, throttling, and switching of emissions.
Chapter 8, Flowable and Backpressure, discusses different ways to cope with backpressure while processing reactive streams. Backpressure happens when data/events are produced faster than they can be consumed.
Chapter 9, Transformers and Custom Operators, explains how to compose new operators from existing ones, how to create a new one from scratch, and how to use rxjava2-extras and rxjava2-extensions for that purpose.
Chapter 10, Testing and Debugging, covers configuring JUnit, blocking subscribers, blocking operators, using TestObserver and TestSubscriber, manipulating time with TestScheduler, and debugging RxJava code.
Chapter 11, RxJava on Android, explains step by step how to create an Android project, how to configure Retrolambda, and how to use RxJava and RxAndroid using RxBinding and other RxAndroid binding libraries.
Chapter 12, Using RxJava with Kotlin, covers several miscellaneous but essential topics, including custom operators, as well as how to use RxJava with testing frameworks, Android, and the Kotlin language.
Appendix A, Introducing Lambda Expressions, provides a short introductory course on Java lambda expressions, which does not require any prior knowledge of the topic.
Appendix B, Functional Types, lists functional interfaces that are included in RxJava 1.*, RxJava 2.*, and RxJava 3.0 – listed with their single-method signature and an indication of which RxJava version has it.
Appendix C, Mixing Object-Oriented and Reactive Programming, presents a discussion on using object-oriented programming in conjunction with RxJava.
Appendix D, Materializing and Dematerializing, introduces the concepts of materializing and dematerializing, along with code examples that demonstrate how they can be used.
Appendix E, Understanding Schedulers, defines the purpose and functionality of schedulers and demonstrates their usage.