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) }
逻辑说明
- 用
lastValue变量缓存当前连续重复元素的最后一个值; - 遍历原始Flow元素时,若当前元素与缓存值重复,则更新缓存为当前元素(覆盖旧的重复值);
- 若遇到不同元素,先输出缓存的上一组重复元素的最后一个,再更新缓存为当前元素;
- Flow结束时,输出最后一组的缓存元素,避免遗漏。
运行这段代码后,收集到的结果即为s1、第三个s2、2,完全符合需求。
内容的提问来源于stack exchange,提问作者ASA
相关产品推荐
相关产品推荐

