我有一个键值对流(例如Flow<Pair<String, Int>>
),我想根据键对其进行去抖动/节流,这样当出现一些具有非唯一键的对序列时,我只会进一步发出最后一个。例如:
val throttled = flow {
emit("A" to 1) // emits at t=0
delay(100)
emit("B" to 6) // emits at t=100
delay(100)
emit("A" to 7) // emits at t=200
delay(100)
emit("A" to 2) // emits at t=300
delay(100)
emit("B" to 8) // emits at t=400
delay(300)
emit("A" to 3) // emits at t=700
}
.throttle(201.milliseconds)
// ...
应在以下位置生产:(B, 6)
,,,。(A, 2)
(B, 8)
(A, 3)
基本上,每当密钥的新值到达时,超时就应该“重置”,并且应该等待指定的持续时间,然后再将对发送到下游。值可以偶尔流入,但不应该留下任何对来等待另一对进入。
使用当前流 API 可以实现这一点吗?
你可以用 channelFlow 尝试一下此代码吗: