¿Cómo se pone la expresión lambda después de los parameters en un map para llamar a la syntax legal?

Encontré un pedazo de código que no entiendo.

Estoy transformando un JSONArray en una List .
Kotlin proporciona la function mapTo en su stdlib ( enlace )

map para

 inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo( destination: C, transform: (T) -> R ): C (source) 

Aplica la function de transformación dada a cada elemento de la colección original y agrega los resultados al destino dado.

Esta function tiene 2 parameters y se puede usar así (como se esperaba):

 (0..jsonArray.length() - 1).mapTo(targetList, {it -> jsonArray[it].toString()}) 

Pero aparentemente esto también es una syntax válida (no esperada):

 (0..jsonArray.length()-1).mapTo(targetList) {it -> jsonArray[it].toString()} 

Como puede ver, los parameters de function terminan después de outputList y la expresión lambda simplemente se pone al final de la llamada a la function.


Además, esto es legal (como se esperaba):

 val transformation = {it : Int -> jsonArray[it].toString()} (0..jsonArray.length()-1).mapTo(targetList, transformation) 

pero esto no es (???):

 val transformation = {it : Int -> jsonArray[it].toString()} (0..jsonArray.length()-1).mapTo(targetList) transformation 

Como se indica en la documentation :

En Kotlin, existe la convención de que si el último parámetro para una function es una function, y está pasando una expresión lambda como el argumento correspondiente, puede especificarlo fuera de paréntesis:

 lock (lock) { shanetworkingResource.operation() } 

Otro ejemplo de una function de order superior sería map ():

 fun <T, R> List<T>.map(transform: (T) -> R): List<R> { val result = arrayListOf<R>() for (item in this) result.add(transform(item)) return result } 

Esta function se puede llamar de la siguiente manera:

 val doubled = ints.map { it -> it * 2 } 

Tenga en count que los paréntesis en una llamada se pueden omitir por completo si la lambda es el único argumento para esa llamada.

La documentation establece claramente que para que lo anterior funcione, el último argumento debe ser expresión lambda y no una variable de tipo coincidente.

  • Función anónima asincrónica en Kotlin? (expresiones lambda)
  • Reescriba el código de Java en Kotlin utilizando la reference de function.
  • Java Lambda para Kotlin
  • ¿Por qué no puedo usar lambda para la interfaz en kotlin?
  • Usar interfaces funcionales con types de funciones en Kotlin
  • ¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?
  • "Lambda con receptor": ¿Qué es esta construcción de Kotlin?
  • Expresiones de kotlin lambda como parámetro opcional
  • Kotin Cómo especificar la label de devolución cuando se incluye en Lambda
  • Parámetros de Clase abstracta vs. Lambda
  • ¿Cómo convierto una matriz de cadenas a una matriz de Int en Kotlin?