【问题标题】:Kotlin: maxBy{} with optimum-valueKotlin:具有最优值的 maxBy{}
【发布时间】:2020-10-12 04:58:59
【问题描述】:

假设我在 Kotlin 中有以下代码:

val min = listOf("hello", "", "teeeeeest").minBy { it.length }

我从 minBy 的实现中了解到,它跟踪变量中的 minValue 并遍历整个集合并在找到更小的元素时对其进行更新。

在字符串的情况下,我们知道任何元素的值都不能小于 0,因此空字符串 "" 是最佳的,可以停止迭代。

有没有办法告诉 minBy(或 maxBy)最佳值,以便一旦达到它就可以停止?如果没有,我怎样才能最容易地实现呢?

【问题讨论】:

    标签: kotlin lambda collections max minimum


    【解决方案1】:

    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
       }
    

    现在你可以这样使用它,它永远不会访问“teeeeest”:

    val min = listOf("hello", "", "teeeeeest").minBy(theoreticalMinimum = 0) { it.length }
    

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多