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 }