我想计算可观察对象传递过来的对象。我知道有一个count
运算符,但是它不能用于无限流,因为它等待完成。
我想要的是类似Value -> operator -> Pair(Int, Value)
的东西。我知道int(或长时)溢出可能存在问题,这也许是一个根本不存在这种原因的原因,但是我仍然觉得自己之前已经看过类似的东西。可以使用scan
运算符来实现这一点,但我认为有一种更简单的方法。
输出如下:
Observable.just(Event1, Event2, Event3) -> (1, Event1), (2, Event2), (3, Event3)
答案 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),以避免发出种子值