Ответ 1
Разница заключается в том, что take(1)
будет передавать 0..1 элементы из восходящего потока, тогда как first
будет ретранслировать самый первый элемент или испускать ошибку (исключение NoSuchElementException), если восходящий поток пуст. Ни один из них не блокирует.
Истина first == take(1).single()
, где take(1)
ограничивает количество элементов восходящего потока до 1 и single()
, гарантирует, что восходящий поток не пуст.
Этот пример печатает только "Готово"
Observable.empty().take(1)
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере печатается "1", а затем "Готово" :
Observable.just(1).take(1)
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере также отображается "1", а затем "Готово" :
Observable.just(1, 2, 3).take(1)
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере не выполняется NoSuchElementException
Observable.empty().first()
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере снова напечатано "1", а затем "Готово" :
Observable.just(1).first()
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере снова напечатано "1", а затем "Готово" :
Observable.just(1, 2, 3).first()
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере печатается стек trace NoSuchElementException
, потому что источник содержит слишком мало элементов:
Observable.empty().single()
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));
В этом примере печатается стек IllegalArgumentException
, поскольку источник содержит слишком много элементов:
Observable.just(1, 2, 3).single()
.subscribe(System.out::println, Throwable::printStackTrace,
() -> System.out.println("Done"));