Kotlin:具有最佳值的 maxBy{}
Kotlin: maxBy{} with optimum-value
假设我在 Kotlin 中有以下代码:
val min = listOf("hello", "", "teeeeeest").minBy { it.length }
我从 minBy 的实现中了解到,它跟踪变量中的 minValue 并遍历整个集合并更新它一旦找到更小的元素。
虽然在字符串的情况下,我们知道没有元素的值可以小于 0,因此空字符串 "" 是最优的并且可以停止迭代。
有什么方法可以告诉我 minBy(或 maxBy)最佳值,以便在达到该值后停止?如果没有,我怎样才能最轻松地实现它?
stdlib 中没有函数可以执行此操作,但您可以自己将其实现为扩展函数。
利用Kotlin内联lambda函数的非本地return特性,可以这样实现:
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 }
假设我在 Kotlin 中有以下代码:
val min = listOf("hello", "", "teeeeeest").minBy { it.length }
我从 minBy 的实现中了解到,它跟踪变量中的 minValue 并遍历整个集合并更新它一旦找到更小的元素。
虽然在字符串的情况下,我们知道没有元素的值可以小于 0,因此空字符串 "" 是最优的并且可以停止迭代。
有什么方法可以告诉我 minBy(或 maxBy)最佳值,以便在达到该值后停止?如果没有,我怎样才能最轻松地实现它?
stdlib 中没有函数可以执行此操作,但您可以自己将其实现为扩展函数。
利用Kotlin内联lambda函数的非本地return特性,可以这样实现:
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 }