Когда я должен использовать blockingGet? - PullRequest
1 голос
/ 17 июня 2019

Я много использую RxJava для работы и видел несколько примеров вызова метода, который возвращает Observable или Single, а затем вызова blockingGet для использования результатов в другом. Я думал, что это может быть неправильное использование библиотеки и концепции, но я могу ошибаться. Я приведу небольшой пример:

   public Observable<String> getStrings(){
     // return sg
   }

   public Observable<String> getNames(){
     // return names
   }

   public Observable<String> filterNamesInStrings() {
     List<String> names = getNames().toList().blockingGet();

     return getStrings().filter(str -> /*is str in names list*/)
   }   

Значение filterNamesInStrings также может быть решено с помощью:

   getNames()
    .toList()
    .flatMapObservable(names-> 
       getStrings().filter(str -> /*is str in names list*/)

Моя интуиция заключается в том, что второе решение лучше, но единственная причина, по которой я это делаю, это то, что я чувствую, используя blocking. Давайте разорвать цепочку наблюдаемых, потерять лень (я не уверен, насколько ленив Rx) но я не нашел ничего, чтобы доказать свою точку зрения, а также ничего, чтобы объяснить, что второе лучше. Также, если я прав, я не вижу другого варианта использования для блокировки get, кроме быстрого тестирования, это правда?

Мои вопросы:

  • Является ли мой вопрос верным или разница между реализациями незначительна?
  • Является ли какое-либо из решений лучшим / более верным для библиотеки, чем другое, если так, то почему и есть ли веская причина использовать blockingGet тогда?
  • (Необязательно: Не могли бы вы порекомендовать мне хорошую книгу по пониманию глубины ReactiveX, поэтому я получу объяснения для таких вопросов, как этот, а также список / книга "хороших практик" будет полезен)

1 Ответ

2 голосов
/ 17 июня 2019

Является ли мой вопрос верным или разница между реализациями незначительна?

blockingGet блокирует текущий поток, так что вы почти наверняка не захотите вызывать его вне тестов. Второй пример - правильный подход.

Является ли какое-либо из решений лучшим / более верным для библиотеки, чем другое, если так, то почему и есть ли веская причина использовать blockingGet тогда?

Тесты в основном. Или редко, при работе с полностью синхронным кодом, где блокировка никогда не происходит.

понимание глубины ReactiveX

Нет книги для этой глубины. Все книги о RxJava хороши для чтения.

...