繁体   English   中英

从Kotlin中的lambda返回值的惯用方式

[英]Idiomatic way to return value from lambda in Kotlin

我有一个返回一些结果的函数,而且我还在测量该函数的运行时间:

private suspend fun <T> runParallelTasksWithStatistics(
    chunksOfParallelTasks: List<List<T>>,
    task: suspend (SessionId?, ClientApiRpcProxy, T) -> Unit
): StressTestStatistics {
    val testStartTimeMs = System.currentTimeMillis()
    val taskResults = runParallelTasks(chunksOfParallelTasks, task)
    val totalMillisPassed = System.currentTimeMillis() - testStartTimeMs

    return calculateStressTestStatistics(
        AggregateTaskResults(taskResults, totalMillisPassed)
    )
}

如您所见,在运行函数runParallelTasks(chunksOfParallelTasks, task)我需要两个值:

  1. totalMillisPassed
  2. taskResults

如何在不求助于var变量的情况下使用measureTimeMillis

val totalMillisPassed = measureTimeMillis {
    val taskResults = runParallelTasks(chunksOfParallelTasks, task)
}

AggregateTaskResults(taskResults, totalMillisPassed)

AggregateTaskResults()的范围内,我只看到totalMillisPassed ,但我也想访问结果taskResults

您可以定义自己的measureTimeMilis版本,该版本返回时间结果:

fun <R> measureTimeMillisWithResult(block: () -> R): Pair<Long, R> {
    val start = System.currentTimeMillis()
    val result = block()
    return Pair(System.currentTimeMillis() - start, result)
}

调用它,您可以利用Pair可以被解构的事实:

val (time, result) = measureTimeMillisWithResult {
    // Calculate the result here.
}
println("Calculation took $time ms")
return result

Todds答案的替代方法,但仍实现自己的功能:

inline fun <T> measureTimeMillis(handleDuration: (Long) -> Unit = { }, supplier: () -> T): T {
    val start = System.currentTimeMillis()
    return supplier().also {
        handleDuration(System.currentTimeMillis() - start)
    }
}

用法如下所示:

val result = measureTimeMillis {
   // your function
}

或者,如果您想对持续时间做其他事情:

val result = measureTimeMillis(::registerDuration) {
   // your function
}
val result = measureTimeMillis( { println("Took $it ms") } ) {
   // your function
}

为避免混淆标准函数,使用其他名称可能会有所帮助。

为此,我创建了自己的度量包装类型,以便可以使用默认的度量工具(记录或打印或其他内容)轻松增强某些表达式。 如果我想测量某些东西,我只需在行的前面或分配之前添加measurer measure (为此使用一个中infix ),这样就无需处理每次测量返回的毫秒数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM