只有当Kotlin流';s排放在给定时间内是恒定的?
我正在创建一个文本识别应用程序,我希望仅当结果在给定的持续时间内保持不变时,流才会发出值。另外,如果在一定时间内没有发出任何值,则拒绝以前的值。这可能有效(我没有测试它)。它依赖于定期输入的新值流,因为它只检查新值出现时的持续时间。如果传入一个值,并且长时间没有其他值,则在后续项到达之前,它不会发出只有当Kotlin流';s排放在给定时间内是恒定的?,kotlin,coroutine,flow,Kotlin,Coroutine,Flow,我正在创建一个文本识别应用程序,我希望仅当结果在给定的持续时间内保持不变时,流才会发出值。另外,如果在一定时间内没有发出任何值,则拒绝以前的值。这可能有效(我没有测试它)。它依赖于定期输入的新值流,因为它只检查新值出现时的持续时间。如果传入一个值,并且长时间没有其他值,则在后续项到达之前,它不会发出 fun <T: Any> Flow<T>.filterToHeldTime(duration: Long): Flow<T> { var value: T
fun <T: Any> Flow<T>.filterToHeldTime(duration: Long): Flow<T> {
var value: T? = null
var changeTime = 0L
return transform { newValue ->
value?.let {
if (System.currentTimeMillis() - changeTime >= duration) {
emit(it)
}
}
if (newValue != value) {
value = newValue
changeTime = System.currentTimeMillis()
}
}.distinctUntilChanged()
}
fun Flow.filterToHeldTime(持续时间:长):流{
变量值:T?=null
var changeTime=0L
返回转换{newValue->
价值?让我们{
if(System.currentTimeMillis()-changeTime>=持续时间){
发射(it)
}
}
if(newValue!=值){
值=新值
changeTime=System.currentTimeMillis()
}
}.distinctUntilChanged()
}
如果希望支持可为null的类型,则必须引入布尔值来跟踪是否收到第一个值
编辑:也许这样行。它不依赖于在决定发射之前等待下一个值。如果该值在指定的持续时间内保持不变,它会立即发出该值
fun <T : Any> Flow<T>.filterToHeldTime(duration: Long): Flow<T> = channelFlow {
var value: T? = null
var delayedSendJob: Job? = null
collect { newValue ->
if (newValue != value) {
value = newValue
delayedSendJob?.cancel()
delayedSendJob = launch {
delay(duration)
send(newValue)
}
}
}
}
fun Flow.filterToHeldTime(持续时间:长):Flow=channelFlow{
变量值:T?=null
var delayedSendJob:作业?=null
收集{newValue->
if(newValue!=值){
值=新值
delayedSendJob?.cancel()
delayedSendJob=启动{
延迟(持续时间)
发送(新值)
}
}
}
}