Я много использую 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, поэтому я получу объяснения для таких вопросов, как этот, а также список / книга "хороших практик" будет полезен)