java - 違い - Concat VS Merge演算子



string.concat c# (1)

私はRXJavaのドキュメントをチェックしていましたが、連結演算子とマージ演算子が同じように見えることがわかりました。 私は確かにカップルのテストを書いた。

@Test
public void testContact() {

    Observable.concat(Observable.just("Hello"),
                      Observable.just("reactive"),
                      Observable.just("world"))
              .subscribe(System.out::println);
}

@Test
public void testMerge() {

    Observable.merge(Observable.just("Hello"),
                      Observable.just("reactive"),
                      Observable.just("world"))
            .subscribe(System.out::println);
}

ドキュメントには

Merge演算子も同様です。 2つ以上のObservableの排出物を結合しますが、それらをインターリーブすることができますが、Concatは複数のObservableからの排出物をインターリーブしません。

しかし、まだ私は完全に理解していない、このテストを何千回実行しても、マージ結果は常に同じです。 注文が許可されていないので、私は時々 "反応的な" "世界の" "こんにちは"と期待していました。

コードはhttps://github.com/politrons/reactiveですhttps://github.com/politrons/reactive


マージは出力をインターリーブすることができますが、コンカットは最初に、以前のストリームが終了してから後のストリームを処理するまで待機します。 あなたの場合、単一要素の静的ストリームでは、実際の違いはありません(理論的には、マージはランダムな順序で単語を出力することができますが、スペックに従って有効です)。 相違点を確認したい場合は、次のようにしてください(早期に終了することを避けるために後で睡眠を追加する必要があります)

    Observable.merge(
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "A" + id),
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "B" + id))
    .subscribe(System.out::println);

A0 B0 A1 B1 B2 A2 B3 A3 B4 A4

    Observable.concat(
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "A" + id),
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "B" + id))
    .subscribe(System.out::println);

A0 A1 A2 A3 A4 A5 A6 A7 A8

ストリームAは決して終わらないので、ConcatはBを印刷しません。

s / stream / observable / g;)

ドキュメンテーションはその違いを示す素晴らしいグラフを提供します。 マージは、アイテムを1つずつインターリーブすることを保証しないことを覚えておく必要があります。これは、単なる可能性のある例の1つです。

連合

マージ





rx-java