A Subject in RxJava is a class that is both an Observable and an Observer. This basically means that it can act as an Observable and pass inputs to subscribers and as an Observer to get inputs from another Observable.
Subject<String, String> subject = PublishSubject.create();
subject.subscribe(System.out::print);
subject.onNext("Hello, World!");
The above prints "Hello, World!" to console using Subjects.
Explanation
The first line of code defines a new Subject of type PublishSubject
Subject<String, String> subject = PublishSubject.create();
| | | | |
subject<input, output> name = default publish subject
The second line subscribes to the subject, showing the Observer behaviour.
subject.subscribe(System.out::print);
This enables the Subject to take inputs like a regular subscriber
The third line calls the onNext method of the subject, showing the Observable behaviour.
subject.onNext("Hello, World!");
This enables the Subject to give inputs to all subscribing to it.
Types
A Subject (in RxJava) can be of any of these four types:
Also, a Subject can be of type SerializedSubject. This type ensures that the Subject does not violate to the Observable Contract (which specifies that all calls must be Serialized)
Further reading: