【问题标题】: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()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2015-03-24
      • 2020-04-11
      • 2017-06-28
      相关资源
      最近更新 更多