You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Flow:如何丢弃同类型旧重复值,仅保留流中最新值

解决Kotlin Flow连续重复元素仅保留最后一个的问题

你的原始Flow定义如下:

val myflow = flow{
    emit("s1")
    emit("s2") 
    emit("s2") 
    emit("s2")
    emit(2)
} 

要实现**丢弃连续重复的前两个s2,仅保留最后一个重复元素,最终收集结果为s1、第三个s2、2**的需求,可以使用transform操作符自定义处理逻辑:

val processedFlow = myflow.transform<Any, Any> {
    var lastValue: Any? = null
    collect { value ->
        if (value == lastValue) {
            // 连续重复时,仅缓存最新的元素
            lastValue = value
        } else {
            // 遇到新元素时,先输出上一组重复元素的最后一个
            lastValue?.let { emit(it) }
            lastValue = value
        }
    }
    // 输出最后一组的剩余元素
    lastValue?.let { emit(it) }
}

// 测试收集结果
processedFlow.collect { println(it) }

逻辑说明

  1. 用lastValue变量缓存当前连续重复元素的最后一个值;
  2. 遍历原始Flow元素时,若当前元素与缓存值重复,则更新缓存为当前元素(覆盖旧的重复值);
  3. 若遇到不同元素,先输出缓存的上一组重复元素的最后一个,再更新缓存为当前元素;
  4. Flow结束时,输出最后一组的缓存元素,避免遗漏。

运行这段代码后,收集到的结果即为s1、第三个s2、2,完全符合需求。

内容的提问来源于stack exchange,提问作者ASA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:07:26