2017-11-08 1 views
0

내가 코드 .parseList { DayForecast(HashMap(it)) }에서 https://github.com/antoniolg/Kotlin-for-Android-DevelopersHashMap (할)은 무엇을 할 것인가?

에서 "안드로이드 개발자를위한 코 틀린"에 대한 샘플 코드를 배우고, 나는 함수의 HashMap이 (가) 무엇을 할 것인지 이해할 수 없습니다. HashMap()이 클래스이고 parmater를 수락합니다 it?

그리고 더 자세히, 나는 DayForecast(...).. 클래스의 전체 코드가 코드 A라고 생각합니까?

다시 말해서 객체 var myDayForecast=DayForecast(10L,"Desciption",10,5,"http://www.a.com",10L)을 만들면 myDayForecast.map가 비어있게됩니까?

코드

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

원본 코드

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

답변

2

나는 대답 here에서부터 생각해 보면, parseList가 Map 개체와 함께 { DayForecast(HashMap(it)) } 클로저를 제공한다는 것을 이미 이해해야합니다. 지금 DayForecast

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

의 정의를 보여으로

는 그러나 동안 MutableMap 수하는 MutableMapMap의 주요 차이점은 Map는 변경할 수 없습니다입니다 MutableMap

필요 변경 될 수 있습니다.

이 필요한 이유는 보조 생성자에서 전달 된 개체가 map으로 변경 (변경)되어 있기 때문입니다. 이 부분은 최근에 question 인 다른 사람의 일부입니다.

HashMapMutableMap 인터페이스의 해시 테이블 기반 구현이므로 MutableMap이 예상되는 경우 사용할 수 있습니다.MutableMap 객체가 차 생성자의에 전달 될 것으로 예상) (

DayForecast,하지만 parseList 단지는 수신 폐쇄에 Map을 제공하므로 솔루션은을 만들 수 HashMap()를 삽입하는 것입니다

그래서 요약 MutableMap.

의견에 제기 된 질문에 대답해야합니다. parseList가 { DayForecast(HashMap(it)) } 대신 닫음 { DayForecast(it) }을 사용하는 이유는 무엇입니까? DayForecast()에 대한 생성자 위에 표시 한대로 MutableMap (Map)이 아니고 it (Map)이고 HashMap(it)MutableMap 일 수 있기 때문입니다.

2

나는 기능 HashMap(it)이 어떤 작업을 수행하는지 이해할 수 없습니다. HashMap()이 클래스이고 it 매개 변수를 허용합니까? docs of HashMap(Map)에서

:

지정된 Map와 같은 매핑으로 새로운 HashMap를 구축합니다. HashMap은 기본로드 인수 (0.75)와 지정된 Map의 매핑을 보유하기에 충분한 초기 용량으로 생성됩니다.

귀하의 질문에 대답 : 예, HashMapMap의 인스턴스가 필요 매개 변수 it을 허용하는 클래스입니다.

관련 문제