Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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中从lambda返回值的惯用方法_Kotlin_Lambda_Functional Programming - Fatal编程技术网

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

Kotlin中从lambda返回值的惯用方法,kotlin,lambda,functional-programming,Kotlin,Lambda,Functional Programming,我有一个返回一些结果的函数,我还测量该函数的运行时间: private suspend fun <T> runParallelTasksWithStatistics( chunksOfParallelTasks: List<List<T>>, task: suspend (SessionId?, ClientApiRpcProxy, T) -> Unit ): StressTestStatistics { val testStar

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

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

在AggregateTaskResults的范围内,我只看到totalMillisPassed,但我还想访问result taskResults。

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

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

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

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

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

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)
    )
}
inline fun <T> measureTimeMillis(handleDuration: (Long) -> Unit = { }, supplier: () -> T): T {
    val start = System.currentTimeMillis()
    return supplier().also {
        handleDuration(System.currentTimeMillis() - start)
    }
}
或者,如果您想在持续时间内执行其他操作:

val result = measureTimeMillis(::registerDuration) {
   // your function
}
val result = measureTimeMillis( { println("Took $it ms") } ) {
   // your function
}
为了避免与标准函数混淆,另一个名称可能会有所帮助


我为此创建了自己的度量包装器类型,这样我就可以很容易地用我的默认度量器来增强一些表达式,这些默认度量器记录或打印或其他任何东西。如果我想测量某个东西,我只需在行前面或赋值之前添加一个measurer measure,这样就不需要处理每次测量返回的毫秒数。

Todds answer的替代方法,但仍然实现您自己的功能:

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)
    )
}
inline fun <T> measureTimeMillis(handleDuration: (Long) -> Unit = { }, supplier: () -> T): T {
    val start = System.currentTimeMillis()
    return supplier().also {
        handleDuration(System.currentTimeMillis() - start)
    }
}
或者,如果您想在持续时间内执行其他操作:

val result = measureTimeMillis(::registerDuration) {
   // your function
}
val result = measureTimeMillis( { println("Took $it ms") } ) {
   // your function
}
为了避免与标准函数混淆,另一个名称可能会有所帮助


我为此创建了自己的度量包装器类型,这样我就可以很容易地用我的默认度量器来增强一些表达式,这些默认度量器记录或打印或其他任何东西。如果我想测量某个东西,我只需要在一行前面或赋值之前添加一个measurer measure,这样就不需要处理每次测量返回的毫秒数。

Hmm,所以没有标准的Kotlin方法允许这样做?嗯,那么没有标准的Kotlin方法允许这样做?