2016-03-28 6 views
1

私はこの講義でCourseraを探していました。Observablesについてhttps://class.coursera.org/reactive-002/lecture/143mapが同じでもObservableとIterableのflatMapが異なる理由

講師はmapObservableIterableに同じ動作をしますが、Observable要素が順番に来ていないので、違ったflatMapに振る舞うことを言います。

mapの場合は同じですか? mapを使用する際に区別がないのはなぜですか?

+0

「同じ」で意味することを詳しく説明できますか?彼らのモナドタイプは同じですが、実際の動作は明らかに異なります(異なる動作をするため)。 – Bergi

+0

「同じ」によって、私は両方のケースで結果が非同期で来るため、注文できないことを意味しました。 – octavian

+0

フラットマップは約**連鎖**オブザーバブルです。 map()はobservableの** result type **を変更することです。 –

答えて

6

講義ではかなり説明されています。

IterableObservableの両方のマップが同じであれば、同じ機能を使用して各要素を単純に変更します。

List(1, 2, 3) map (_ + 1)利回りList(1, 2, 3)

それはソースObservableが値を生成するだけでいつでも、順序を変更するにはObservableにマップするために意味をなさないだろう、1は、元の値を生成するが、特定の目的球でそれに適用されるマッピングされました。注文は保存されます。

しかし、flatMapは関数A => Observable[A]を受け取りますので、各要素に対して別のObservableを作成します。

あなたはそれらCONCAT、その機能が

List(List(2, 3, 4), List(11, 12, 13), List(101, 102, 103)) 

をもたらすであろうかのように

List(2, 3, 4, 11, 12, 13, 101, 102, 103) 

は、あなたがそれについて考えることができるもたらすとwhould

List(1, 10, 100).flatMap(n => List(n + 1, n + 2, n + 3)) 

可能性がありListのために持っているだろうかそれら(リストを平らにする)。

Observablesについて同じことを行う場合は、各要素について、値を非同期的に作成するObservableが返されます。表示されるタイミングはわかりません。

Observable(2, 3, 4), Observable(11, 12, 13), Observable(101, 102, 103) 

、それらがマージされたときに要素の順序がどうなるか分からない4および102は前になる前に、あなたは唯一の3が来ることを確認することができます:だから、基本的に、あなたは3つの観測を持っているでしょう103となりますが、11または2で始まるか101で始まるかは関係ありません。

flatMapIterablesは、Observablesとは異なる動作をします。 Observablesの場合はIterablesオーダーで決定されますが、エレメントの順序はどのようになることはできません。これが最後の緑の大理石の前に来た絵は青marbelsの

enter image description here

一つを示したまさにです。 Iterablesの場合はそうではありませんが、赤色2色、緑色2色、青色2色の順になります。

関連する問題