当前位置: 首页 > 面试题库 >

Concat VS合并运算符

盖弘毅
2023-03-14
问题内容

我查看了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);
}

该文件说

合并运算符也类似。它结合了两个或多个可观察物的排放,但可以交错,而Concat绝不会交错多个可观察物的排放。

但是我还是不太了解,运行此测试数千次,合并结果始终是相同的。由于未授予该命令,因此我期望有时会出现“反应性”,“世界”,“你好”。

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


问题答案:

如您所引用的文档中所述-
合并可以交错输出,而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;)

文档提供了漂亮的图形来显示差异。您需要记住,合并不能 保证 逐项交错,这只是可能的例子之一。

康卡特

合并



 类似资料:
  • 主要内容:RxJava 合并运算符 介绍,RxJava 合并运算符 示例RxJava 合并运算符 介绍 以下是用于从多个 Observable 创建单个 Observable 的运算符。 运算符 描述 And/Then/When 使用模式和计划中介组合项目集。 CombineLatest 通过指定的函数组合每个 Observable 发出的最新项并发出结果项。 Join 如果在第二个 Observable 发射项目的时间范围内发送,则组合两个 Observable 发

  • 本文向大家介绍PHP 空合并运算符(??),包括了PHP 空合并运算符(??)的使用技巧和注意事项,需要的朋友参考一下 示例 空合并是PHP 7中引入的新运算符。如果未设置,则该运算符返回其第一个操作数NULL。否则,它将返回其第二个操作数。 下面的例子: 等同于两者: 和: 该运算符也可以被链接(具有右关联语义): 这等效于: 注意: 在字符串连接上使用合并运算符时,请不要忘记使用括号() 这将

  • A recent addition This is a recent addition to the language. Old browsers may need polyfills. 在本文中,我们将值既不是 null 也不是 undefined 的表达式称为“已定义的(defined)”。 空值合并运算符(nullish coalescing operator)的写法为两个问号 ??。 a

  • 有人能解释一下PHP中三元运算符速记()和空合并运算符()之间的区别吗? 他们什么时候表现不同,什么时候表现相同(如果发生的话)? VS。

  • 本文向大家介绍Kotlin 空合并/Elvis运算符,包括了Kotlin 空合并/Elvis运算符的使用技巧和注意事项,需要的朋友参考一下 示例 有时希望以if-else方式评估可为空的表达式。Elvis运算符?:可以在Kotlin中用于这种情况。 例如: 如果 data?.first ()或数据本身产生 null 值,则上面的表达式返回“ Nothing here” ,否则返回 data?. f

  • 问题内容: 有人可以解释PHP中的三元运算符速记()和空合并运算符()之间的区别吗? 它们什么时候表现不同,什么时候以相同的方式表现(如果甚至发生)? VS。 问题答案: 当您的第一个参数为null时,它们基本相同,不同之处在于,当您有未定义的变量时,null合并不会输出。在PHP7.0迁移的文档有这样一段话: 对于需要将三元数与isset()结合使用的常见情况,已将空合并运算符(??)添加为语法