Concat VS Merge运算符

我正在检查RXJava的文档,我注意到concat和merge运算符似乎也是这样。 我写了几个测试以确定。

@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运算符也类似。 它结合了两个或多个Observable的发射,但可以交错它们,而Concat从不交错来自多个Observable的发射。

但是我还是不完全明白,运行这个测试千次,合并结果总是一样的。 由于订单未被授予,我期待有时“react native”“世界”“你好”。

代码在这里https://github.com/politrons/reactive

它如您引用的文档中所述 – merge可以交错输出,而concat将首先等待更早的流完成,然后再处理后续流。 在你的情况下,对于单元素,静态流,它没有任何真正的区别(但理论上,合并可以按随机顺序输出单词,并且仍然根据规范有效)。 如果你想看到差异,请尝试以下(之后你需要增加一些睡眠以避免提前退出)

  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

Concat将永远不会开始打印B,因为流A永远不会完成。

s / stream / observable / g;)

文档提供了很好的图表来显示差异。 你需要记住,merge不能保证逐个交错项,这只是一个可能的例子。

CONCAT

Concat运营商 合并

合并运算符