Кажется, что эти 2 функции довольно похожи. Они имеют одну и ту же подпись (принимают rx.functions.Func1<? super T, ? extends Observable<? extends R>> func), а их мраморные диаграммы выглядят точно так же. Невозможно вставить фотографии здесь, но здесь один для concatMap, и здесь один для flatMap. Кажется, что в описании результирующего Observable есть некоторая тонкая разница, в которой один из выражений concatMap содержит элементы, которые являются результатом объединения результатов Observables, а результат, созданный flatMap, содержит элементы, которые являются результатом первого слияния полученных Observables, и испускает результат этого слияния.
Однако эта тонкость для меня совершенно неясна. Может ли кто-нибудь дать лучшее объяснение этой разницы и в идеале дать несколько примеров, иллюстрирующих эту разницу.