Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
只有当Kotlin流';s排放在给定时间内是恒定的?_Kotlin_Coroutine_Flow - Fatal编程技术网

只有当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=启动{
延迟(持续时间)
发送(新值)
}
}
}
}