2017-11-02 11 views
4

私はAnkoが関数parseSingle、parseOpt、parseListを提供していることを知っていますが、なぜAndroid Developers(本)のコードが拡張parseListを設計する必要があるのか​​分かりません。なぜAndroid開発者向けのKotlin(本)はparseListを再度追加する必要がありますか?

教えてください。ありがとう!

https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/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)) } 

} 

https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/extensions/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) 
}) 

答えて

2

アンコのparseListMapRowParser、ない機能を取ります。これにより、使用が簡単になります。 Ankoバージョンでは、代わりに

.parseList { mapRowParser { DayForecast(HashMap(it)) } } 

を入力してください。それは、ソースで見つけることができないmapRowParserのようなコンストラクタ関数があると仮定しています。それ以外の場合は、非常に簡単に書くことができます。

というか、それはまだだけではない別の関数として、サンプルコードでは、あなたのために書かれています:

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

この機能は、すでに(多分何かを呼ばれ、存在しない場合、私は正直に本当に驚いていますしかし何?)。 OTOH、もし存在すれば、Leivaはそれを使っていたはずです。

+0

ありがとうございます! HashMap(it)とは何ですか? – HelloCW

+0

HashMap(it)のフルコードは何ですか – HelloCW

+0

コンストラクタはKotlinでどのように呼び出されますか。入力マップを新しい 'HashMap'にコピーします(なぜなら、' DayForecast(it) 'の代わりになぜか分かりません)。 –

関連する問題