К какому типу потока данных относится Subject в RxJava

«К какому типу потока данных относится Subject в RxJava» — вопрос из категории Реактивное программирование, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Subject в RxJava — это гибридный тип потока данных, который одновременно является и Observer, и Observable. Он может принимать события (как Observer) и эмитировать их подписчикам (как Observable).

Основные виды Subject:

  • PublishSubject: эмитит только новые события после подписки.
  • BehaviorSubject: хранит последнее значение и эмитит его новым подписчикам.
  • ReplaySubject: сохраняет все (или N) события и эмитит их новым подписчикам.
  • AsyncSubject: эмитит только последнее значение при завершении.

Пример:

val subject = PublishSubject.create<Int>()  
subject.subscribe { println("Subscriber 1: $it") }  
subject.onNext(1)  
subject.subscribe { println("Subscriber 2: $it") }  
subject.onNext(2)  
// Вывод:  
// Subscriber 1: 1  
// Subscriber 1: 2  
// Subscriber 2: 2