【问题标题】:How do I modify Kotlin Flow distinctUntilChanged to add an expiry time如何修改 Kotlin Flow distinctUntilChanged 以添加到期时间
【发布时间】:2022-11-17 22:46:10
【问题描述】:
我如何使用 distinctUntilChanged() 并为其添加过期时间,这意味着如果相同的值在流中,我们仍然会收集它,因为它比之前重复的值发出后的 expiry 毫秒长。
flow {
emit("A") // printed
emit("B") // printed
emit("A") // printed
emit("A") // NOT printed because duplicate
delay(5000)
emit("A") // printed because 5 seconds elapsed which is more than expiry
}
.distinctUntilChanged(expiry = 2000)
.collect {
println(it)
}
我想这样打印:
A
B
A
A
【问题讨论】:
标签:
kotlin
kotlin-coroutines
kotlin-flow
【解决方案1】:
我认为这会起作用,但我没有进行太多测试。我认为逻辑是不言自明的。 havePreviousValue 存在的原因是万一 T 可以为 null 而第一个发出的值是 null。
fun <T> Flow<T>.distinctUntilChanged(expiry: Long) = flow {
var havePreviousValue = false
var previousValue: T? = null
var previousTime: Long = 0
collect {
if (!havePreviousValue || previousValue != it || previousTime + expiry < System.currentTimeMillis()) {
emit(it)
havePreviousValue = true
previousValue = it
previousTime = System.currentTimeMillis()
}
}
}