Rx java 通过flatMap输出重复的嵌套观测值

Rx java 通过flatMap输出重复的嵌套观测值,rx-java,rx-java2,Rx Java,Rx Java2,我有一个“外部”观测值和一个“内部”观测值的缓存。我选择哪一个“内部”可观察对象取决于“外部”可观察对象的输出。当它们中的任何一个发生变化时,我希望结合它们的结果。如果“外部”或“内部”更改,我希望合并新值。我尝试使用flatMap执行此操作,但遇到了触发太多事件(即重复事件)的问题 这个输出类似于 00:17:36 Outer(0):Inner(zero:0) 00:17:37 Outer(0):Inner(zero:1) 00:17:38 Outer(0):Inner(zero:2) 00:

我有一个“外部”观测值和一个“内部”观测值的缓存。我选择哪一个“内部”可观察对象取决于“外部”可观察对象的输出。当它们中的任何一个发生变化时,我希望结合它们的结果。如果“外部”或“内部”更改,我希望合并新值。我尝试使用flatMap执行此操作,但遇到了触发太多事件(即重复事件)的问题

这个输出类似于

00:17:36 Outer(0):Inner(zero:0)
00:17:37 Outer(0):Inner(zero:1)
00:17:38 Outer(0):Inner(zero:2)
00:17:39 Outer(1):Inner(one:0)
00:17:39 Outer(0):Inner(zero:3)
您会注意到,我在
00:17:39
得到两个输出。我真正想要的是这样的输出

00:17:36 Outer(0):Inner(zero:0)
00:17:37 Outer(0):Inner(zero:1)
00:17:38 Outer(0):Inner(zero:2)
00:17:39 Outer(1):Inner(one:0)
我的问题似乎是缓存可观察映射的索引0处的内部可观察仍然在出售,因此导致发送附加值。我不知道如何避免这种情况发生,因为当我想切换到另一个时,没有观察到的东西在实际完成。随着时间的推移,问题变得更糟,因为每个outerObs vend都会导致更多不希望的重复

fun test() {
    val outerObs = Observable.interval(3, TimeUnit.SECONDS)
    val innerObsCache = mapOf(
            0L to Observable.interval(0, 1, TimeUnit.SECONDS).map { "zero:$it" }.share(),
            1L to Observable.interval(0, 1, TimeUnit.SECONDS).map { "one:$it" }.share()
    )

    outerObs
            .flatMap { outerVal ->
                innerObsCache[outerVal % 2]!!.map { "Outer($outerVal):Inner($it)" }
            }.subscribe({ combinedResult -> println("$now $combinedResult") })
}

private val now get() = SimpleDateFormat("HH:mm:ss").format(Date())

我确信我应该在这里使用一些其他的RX技术来获得我所期望的,但是可以使用一些指导。

找出它。考虑到我的用例,我使用了错误的运算符

switchMap
符合我的要求。当外部可观测值忽略一个新值时,它将从内部可观测值中取消订阅

outerObs
  .switchMap { outerVal ->
    innerObsCache[outerVal % 2]!!.map { "Outer($outerVal):Inner($it)" }
  }.subscribe({ combinedResult -> println("$now $combinedResult") })
产生所需的输出

00:19:53 Outer(0):Inner(zero:0)
00:19:54 Outer(0):Inner(zero:1)
00:19:55 Outer(0):Inner(zero:2)
00:19:56 Outer(1):Inner(one:0)