¿Por qué puedo insert un código de línea antes de DayForecast (HashMap (it)) en Kotlin?

Estoy aprendiendo el código de muestra sobre Anko en Kotlin para desarrolladores de Android (el libro) en https://github.com/antoniolg/Kotlin-for-Android-Developers

Agrego una línea var myMap=it antes de DayForecast(HashMap(it)) , creo que la aplicación se bloqueará porque la definición de parseList es parseList(parser: (Map<String, Any?>) -> T) , puedo solo asigne una function a parseList. Pero la aplicación puede ejecutarse correctamente, ¿por qué?

Mi ForecastDb.kt modificado

 override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?" val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { var myMap=it DayForecast(HashMap(it)) } } 

ForecastDb.kt

 override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?" val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { DayForecast(HashMap(it)) } } 

DatabaseExtensions.kt

 fun <T : Any> SelectQueryBuilder.parseList(parser: (Map<String, Any?>) -> T): List<T> = parseList(object : MapRowParser<T> { override fun parseRow(columns: Map<String, Any?>): T = parser(columns) }) 

La firma de la function es parseList(parser: (Map<String, Any?>) -> T) . El (Map<String, Any?>) -> T) como parámetro significa que la function parseList toma como argumento un tipo de function con una firma de un solo argumento ( Map<String, Any?> ) Que devuelve un T

Este es un ejemplo de funciones de order superior ).

En tu ejemplo, estás pasando una expresión lambda :

 .parseList { var myMap=it DayForecast(HashMap(it)) } 

En tu expresión lambda, realmente puedes hacer cualquier cosa siempre que devuelvas el tipo T Puede invocar funciones múltiples, crear objects, asignar variables, lo que sea, siempre que devuelva el tipo T al final.

Para ilustrar aún más esto imaginemos que tenemos una function que toma otra function como argumento, que toma un Int como parámetro y devuelve un Int :

 fun funTakingOne(function: (Int) -> Int): Int { return function(1) } 

Ahora, una forma de llamar a esa function es pasar una expresión lambda:

 val output = funTakingOne { it + 5 } println(output) 

El resultado aquí es 6 .

También puede devolver explícitamente un valor de la lambda utilizando la syntax de retorno calificada . A continuación hay dos llamadas idénticas:

 funTakingOne { it + 2 } funTakingOne { return@funTakingOne it + 2 } 

El retorno de esta expresión lambda es un Int . También podemos hacer otras cosas dentro de nuestra expresión lambda, siempre que la salida sea un Int :

 funTakingOne { val someCalculation: Int = expensiveCalculation(it) val otherCalculation: Int = otherCalculation(it) someCalculation / otherCalculation } 

Si intentas devolver algo que no sea Int aquí, el comstackdor fallará con una discrepancia de tipo:

 // This fails to compile funTakingOne { "oh no, I fail" } 

En su ejemplo, la firma tiene un parámetro genérico (el tipo T ). Es similar a los ejemplos anteriores, excepto que la function debe devolver algo de tipo T

Aquí hay otro ejemplo artificial. Una function que toma una function como un argumento que tiene un único parámetro de String y devuelve algo de tipo T :

 fun <T> funReturnT(function: (String) -> T): T { return function("Hello World") } 

Llamarlo podría verse así:

 val output = funReturnT { "$it! Great day today!" } println(output) 

¡Y el resultado aquí es Hello World! Great day today! Hello World! Great day today! . El tipo de output inferido aquí es String , porque nuestra expresión lambda está devolviendo un String (el tipo inferido T de la function). Esto es lo mismo que hacer lo siguiente:

 val output: String = funReturnT { "$it! Great day today!" } println(output) 

Si cambiamos el tipo esperado de la output , obtendremos una falla del comstackdor debido a que el tipo no coincide.

 // This fails to compile val output: Int = funReturnT { "$it! Great day today!" } println(output) 
  • Dónde poner index.html en un proyecto de Kotlin-js?
  • En Kotlin, ¿cómo abro un enlace en una nueva window?
  • RxJava BehaviorSubject no emite el último elemento?
  • ¿Qué significa "it <= ''" en la function de cadena de recorte aquí?
  • ¿Por qué este método de Kotlin tiene palos de respaldo?
  • Android ClassNotFoundException No encontró la class en la ruta: DexPathList
  • asignar variable solo si es nulo
  • Extraña java.lang.ClassCastException al usar la llamada
  • Manejo de tipo anulable en RxJava con Kotlin
  • RxJava2 observable no procesando en Siguiente cuando hay un cambio
  • Usar varios lenguajes JVM en el mismo proyecto