RxJava-动态计算事件

时间:2018-09-03 14:33:23

标签: count observable rx-java2

我想计算可观察对象传递过来的对象。我知道有一个count运算符,但是它不能用于无限流,因为它等待完成。

我想要的是类似Value -> operator -> Pair(Int, Value)的东西。我知道int(或长时)溢出可能存在问题,这也许是一个根本不存在这种原因的原因,但是我仍然觉得自己之前已经看过类似的东西。可以使用scan运算符来实现这一点,但我认为有一种更简单的方法。

输出如下:

Observable.just(Event1, Event2, Event3) -> (1, Event1), (2, Event2), (3, Event3)

2 个答案:

答案 0 :(得分:0)

计数表示状态更改。因此,您可以使用“状态”映射而不是匿名类。 例如:

class Mapper<T, R>(val mapper: (T) -> R) : Function<T, Pair<Int, R>> {
    private var counter = 0
    override fun apply(t: T): Pair<Int, R> {
        return Pair(counter++, mapper(t))
        //or ++counter if you want start from 1 instead of zero
    }
}

//usage

val mapper = Mapper<String, String> { it.toUpperCase() }

Observable.just("a", "b", "c")
          .map(mapper)
          .subscribe {
            Log.d("test logger", it.toString())
           }

答案 1 :(得分:0)

您可以使用RxJava Scan方法解决您的问题:

Observable.just("a", "b", "c")
    .scan(new Pair<>(0, ""), (pair, s) -> new Pair<>(pair.first + 1, s))
    .skip(1)

配对<>(0,“”)是您的种子值

Lambda(pair,s)-> new Pair <>(pair.first + 1,s)获取种子值和原始可观察值发出的值,然后产生下一个Pair对值,将其发出并反馈给lambda

需要跳过(1),以避免发出种子值