Moritz Groß
Moritz Groß

Reputation: 1490

Kotlin: maxBy{} with optimum-value

Let's say I have the following code in Kotlin:

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

What I understand from the implementation of minBy is that it tracks minValue in a variable and iterates through the whole collection and updates it once it finds an even smaller element.

In the case of Strings though, we know that no element can have a value smaller than 0, therefore the empty String "" is optimal and the iteration can be stopped.

Is there a way I can tell minBy (or maxBy) the optimal value so it can stop once that is reached? If not, how can I implement this most easily?

Upvotes: 2

Views: 953

Answers (1)

marstran
marstran

Reputation: 27971

There's no function in the stdlib that can do this, but you can implement it as an extension function yourself.

By using the non-local return feature of inline lambda functions in Kotlin, you can implement it like this:

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
   }

Now you can use it like this, and it will never visit "teeeeeest":

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

Upvotes: 4

Related Questions