¿Qué hará HashMap (it)?

Estoy aprendiendo el código de ejemplo sobre "Kotlin para desarrolladores de Android" en https://github.com/antoniolg/Kotlin-for-Android-Developers

En el código .parseList { DayForecast(HashMap(it)) } , no puedo entender qué hará la function HashMap (it). ¿Es HashMap () una class y acepta un parmater?

Y más, creo que el código completo de la class DayForecast(...).. es el Código A, ¿verdad?

De nuevo, si creo un object var myDayForecast=DayForecast(10L,"Desciption",10,5,"http://www.a.com",10L) , myDayForecast.map estará vacío, ¿no?

Código A

 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(map: MutableMap<String, Any?>=HashMap()) { this.date = date this.description = description this.high = high this.low = low this.iconUrl = iconUrl this.cityId = cityId } } 

Código original

 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)) } val city = select(CityForecastTable.NAME) .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString()) .parseOpt { CityForecast(HashMap(it), dailyForecast) } city?.let { dataMapper.convertToDomain(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 } } 

Creo que a partir de la respuesta aquí , ya debes entender que parseList proporciona el cierre { DayForecast(HashMap(it)) } con un object Map .

Pero como ahora muestra la definición de DayForecast

class DayForecast(var map: MutableMap<String, Any?>)

requiere un MutableMap

La diferencia principal entre un MutableMap y un Map es que un Map no se puede cambiar, mientras que un Map MutableMap se puede cambiar.

La razón por la que DayForecast necesita un MutableMap es porque en el constructor secundario el object pasado, denominado map está alterado (mutado). Esta es parte de usted otra pregunta reciente.

HashMap es una implementación basada en la tabla Hash de la interfaz MutableMap , por lo que puede utilizarse siempre que se MutableMap un MutableMap .

Entonces para resumir:

DayForecast () espera que un object MutableMap pase a su constructor primario, pero parseList solo proporciona un Map para el cierre que recibe, por lo que la solución es insert el HashMap() para crear un MutableMap .

Esto también debería responder a una pregunta que planteaste en un comentario, ¿por qué no puede parseList tomar el cierre { DayForecast(it) } lugar de { DayForecast(HashMap(it)) } ? Es porque como se muestra arriba, el constructor de DayForecast () espera un MutableMap , que it es (es un Map ) mientras que HashMap(it) es un MutableMap .

No puedo entender lo HashMap(it) hará la function HashMap(it) . ¿Es HashMap() una class y acepta un parámetro?

De los documentos de HashMap(Map) :

Construye un nuevo HashMap con las mismas asignaciones que el Map especificado. HashMap se crea con un factor de carga pnetworkingeterminado (0,75) y una capacidad inicial suficiente para mantener las asignaciones en el Map especificado.

Para responder a su pregunta: sí, HashMap es una class que acepta el parámetro que necesita ser una instancia de Map .

  • RxJava Observable a Completable, cómo evitar toBlocking ()
  • Por qué Netbeans se queja de la ambigüedad, mientras que Intellij no lo hace
  • Gradle no puede resolver references de otro module
  • Actualice 2 POST XML y obtenga la respuesta JSON de la API. con Kotlin
  • Spring Boot inserta datetime no válido en MariaDB da como resultado nulo, en campo no anulable
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • La debugging de Android Kotlin Task no se encuentra en el proyecto raíz
  • Refiriéndose a los parameters de function vararg Kotlin
  • Evento táctil de interceptación y networkingirigirlo en function del estado del evento de movimiento
  • Elimina getters y setters del código de kotlin
  • Biblioteca para detectar memory leaks en Android usando Kotlin