¿Qué pasó cuando se ejecuta el código HashMap (it)?

El siguiente código de ejemplo es de Kotlin-for-Android-Developers en https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/ data / db / ForecastDb.kt

No puedo entender completamente el código DayForecast(HashMap(it)) . ¿Qué significa eso?

Y más, ¿qué sucedió cuando se parseList { DayForecast(HashMap(it)) } la parseList { DayForecast(HashMap(it)) } ?

 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)) } } class DayForecast(var map: MutableMap<String, Any?>) { var _id: Long by map var date: Long by map var description: String by map var high: Int by map var low: Int by map var iconUrl: String by map var cityId: Long by map constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) : this(HashMap()) { this.date = date this.description = description this.high = high this.low = low this.iconUrl = iconUrl this.cityId = cityId } } 

Adicional

En el siguiente código de ejemplo, puedo entender "it" en el código val doubled = ints.map {it * 2 } , "it" es el elemento de variables, como 10, 20, 30!

Pero en el código val dailyForecast = select(DayForecastTable.NAME).whereSimple(dailyRequest, zipCode.toString(), date.toString()).parseList { DayForecast(HashMap(it)) } , ¿qué significa "it"?

Código de muestra

  var ints= listOf(10,20,30); val doubled = ints.map {it * 2 } 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 } 

Como Lym Zoy dice it es el nombre implícito del único argumento para un cierre.

Si no está familiarizado con los cierres y las funciones de order superior en Kotlin, puede leer sobre ellos aquí . Una function que toma un cierre / function / lambda, es una que básicamente está pidiendo ayuda para hacer su trabajo.

Me gusta usar sortedBy como un buen ejemplo. sortedBy es una function en la biblioteca de collections de Kotlin que orderará una colección, pero para que funcione necesita un atributo comparable para cada elemento. La forma en que resuelve esto es que le pida a usted, el usuario de la function sortedBy, que proporcione una function que tome un miembro de la colección y devuelva un atributo comparable. Por ejemplo, si la colección era una list de objects Person, podría proporcionar sortedBy un cierre diferente si desea orderar por firstName, lastName o age.

Aquí hay un ejemplo rápido que también puede encontrar aquí , que muestra cómo sortedBy puede tomar un argumento de cierre que toma un miembro y devuelve un atributo comparable que se sortedBy para poder clasificar a los diversos miembros de la colección. En el primer caso, el cierre / function devuelve la edad del miembro y, en el segundo caso, el cierre devuelve el apellido (usando la forma implícita), ambos Comparables, un Int y un String.

 data class Person(val firstName: String, val lastName: String, val age: Int) fun main(args: Array<String>) { val people = listOf( Person("Jane", "Jones", 27), Person("Johm", "Smith", 22), Person("John", "Jones", 29)) val byAge = people.sortedBy { person -> person.age } // explicit argument: person is a memeber of the List of Persons val byLastName = people.sortedBy { it.lastName } // implict argument: "it" is also a member of the List of Persons println(people) println(byAge) println(byLastName) 

}

Volviendo al detalle de su pregunta específica.

En su pregunta, la function parseList que se encuentra aquí se define como tal:

 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) }) 

Esta es una function que requiere un cierre que espera un argumento de tipo Map<String, Any?>

Entonces en la llamada que se muestra en su pregunta:

 .parseList { DayForecast(HashMap(it)) } 

donde { DayForecast(HashMap(it)) } es el cierre que se espera que pase a parseList,
la forma más larga { arg -> DayForecast(HashMap(arg) } podría haberse utilizado también, pero la forma abreviada { DayForecast(HashMap(it)) } es la forma más idiomática en la que se usa it ya que el argumento le permite omitir el argumento arg -> parte

Entonces, en este caso it es un object Map provisto por la function parseList . El object referido por it se pasa luego como el único argumento para un constructor HashMap (que no sorprendentemente espera un Mapa), el resultado de esa construcción, luego se pasa al constructor de DayForecast

es el nombre implícito de un solo parámetro. Verifique el documento aquí .

  • No se puede actualizar el valor del parámetro del método Kotlin
  • ¿Cómo comparo un Corto con un Int en Kotlin?
  • Usar un Flux en lugar de un bucle for, ¿algún beneficio?
  • Kotlin usando cuando por condiciones simples
  • Kotlin - equivalencia a SomeClass.class para objects?
  • Error: ejecución fallida para la tarea ': app: javaPreCompileDebug'. > java.io.IOException: no se pudo eliminar annotationProcessors.json
  • Llamar a un RxJava Single In Kotlin Lambda
  • ¿Cómo hacer una request de API en Kotlin?
  • Android Kotlin pasa el valor de los campos de text a numberPicker
  • Delegar propiedad a otra propiedad
  • Android Unit Test of Kotlin class falla con "no se puede encontrar la class de símbolo ..."