假设我在Kotlin中有以下代码:
val min = listOf("hello", "", "teeeeeest").minBy { it.length }
从minBy的实现中我了解到的是,它在变量中跟踪minValue并遍历整个集合,并在找到更小的元素时对其进行更新。
但是对于Strings,我们知道没有元素的值不能小于0,因此空String“”是最佳的,并且可以停止迭代。
有没有一种方法可以告诉minBy(或maxBy)最佳值,以便一旦达到最佳值就可以停止?如果没有,我如何才能最轻松地实现呢?
stdlib中没有函数可以执行此操作,但是您可以自己将其实现为扩展函数。
通过在Kotlin中使用内联lambda函数的非本地返回功能,您可以像这样实现它:
fun <T, E : Comparable<E>> Iterable<T>.minBy(theoreticalMinimum: E, keySelector: (T) -> E): T? =
minBy {
val key = keySelector(it)
if (key <= theoreticalMinimum) return it // Non-local return.
else key
}
现在,您可以像这样使用它,它将永远不会访问“ teeeeeest”:
val min = listOf("hello", "", "teeeeeest").minBy(theoreticalMinimum = 0) { it.length }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句