2017-11-08 6 views
0

Ich lerne verstehen den Beispielcode über "Kotlin für Android-Entwickler" bei https://github.com/antoniolg/Kotlin-for-Android-DevelopersWas wird HashMap (it) tun?

Im Code .parseList { DayForecast(HashMap(it)) }, kann ich nicht, was die Funktion HashMap (es) tun. Ist HashMap() eine Klasse und akzeptieren Sie einen Parameter it?

Und mehr, ich denke, dass der vollständige Code der Klasse DayForecast(...).. Code A ist, richtig?

Noch einmal, wenn ich ein Objekt var myDayForecast=DayForecast(10L,"Desciption",10,5,"http://www.a.com",10L) erstellen, wird myDayForecast.map leer sein, oder?

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

Originalcode

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

Antwort

2

Ich denke, aus der Antwort here, sollten Sie bereits verstehen, dass parseList bietet die Schließung { DayForecast(HashMap(it)) } mit einem Map Objekt.

Aber wie Sie jetzt die Definition von DayForecast

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

zeigen erfordert eine MutableMap

Der primäre Unterschied zwischen einem MutableMap und einem Map ist, dass ein Map nicht geändert werden kann, während ein MutableMap können verändert sein.

Der Grund DayForecast benötigt eine MutableMap ist, weil im sekundären Konstruktor das Objekt, das als map übergeben wird, geändert wird (mutiert). Dies ist ein Teil von Ihnen anderen jüngsten question.

HashMap ist eine Hash-Tabelle basierte Implementierung der MutableMap Schnittstelle, so kann es verwendet werden, wo jemals ein MutableMap erwartet wird.

Um es zusammenzufassen:

DayForecast() erwartet ein MutableMap Objekt übergeben werden, um es primären Konstruktor ist, aber parseList liefert nur ein Map zur Schließung sie empfängt, so dass die Lösung ist, die HashMap() einzufügen ein erstellen MutableMap.

Dies sollte auch eine Frage beantworten, die Sie in einem Kommentar gestellt haben, warum kann parseList nicht einfach die Schließung statt { DayForecast(HashMap(it)) } nehmen? Es ist weil, wie Sie oben sehen, der Konstruktor für DayForecast() erwartet eine MutableMap, die it ist nicht (es ist ein Map), während HashMap(it) ist ein MutableMap.

2

Ich kann nicht verstehen, was die Funktion HashMap(it) tun wird. Ist HashMap() eine Klasse und akzeptieren Sie einen Parameter it?

Vom docs of HashMap(Map):

Konstruiert ein neues HashMap mit den gleichen Zuordnungen wie die angegebene Map. Die HashMap wird mit dem Standardauslastungsfaktor (0,75) und einer Anfangskapazität erstellt, die ausreicht, um die Zuordnungen im angegebenen Map zu speichern.

Um Ihre Frage zu beantworten: Ja, HashMap eine Klasse, die it Parameter akzeptiert, die brauchen eine Instanz von Map sein.