如何将MutableMap <String,Any?>传递给vararg值:Pair <String,Any?>?

Hel*_*oCW 7 android kotlin anko

以下代码来自"Kotlin for Android Developers",您可以访问https://github.com/antoniolg/Kotlin-for-Android-Developers

为了插入行数据CityForecastTable.NAME,我必须vararg通过源代码传递值 fun SQLiteDatabase.insert

1: 作者做了一个扩展toVarargArray()转换MutableMap<String, Any?>Pair<String, Any?>,我不知道是否有更好的方法来做到这一点.我需要使用扩展功能吗?

2: 作者必须使用it.value!!代码C中的代码,我不知道代码fun <K, V : Any> Map<K, V?>.toVarargArray(): Array<out Pair<K, V?>> = map({ Pair(it.key, it.value) }).toTypedArray()是否正确?

3:当我插入列包含空值的行数据时,我不知道应用程序是否会崩溃.

import org.jetbrains.anko.db.*
class ForecastDb(private val forecastDbHelper: ForecastDbHelper = ForecastDbHelper.instance,
                 private val dataMapper: DbDataMapper = DbDataMapper()) : ForecastDataSource {

    fun saveForecast(forecast: ForecastList) = forecastDbHelper.use {           

         //dataMapper.convertFromDomain(forecast) will return CityForecast object 
         with(dataMapper.convertFromDomain(forecast)) {
            insert(CityForecastTable.NAME, *map.toVarargArray())           
        }
    }

}


class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
            : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}
Run Code Online (Sandbox Code Playgroud)

代码C.

fun <K, V : Any> Map<K, V?>.toVarargArray(): Array<out Pair<K, V>> =
        map({ Pair(it.key, it.value!!) }).toTypedArray()
Run Code Online (Sandbox Code Playgroud)

源代码

fun SQLiteDatabase.insert(tableName: String, vararg values: Pair<String, Any?>): Long {
    return insert(tableName, null, values.toContentValues())
}
Run Code Online (Sandbox Code Playgroud)

小智 3

你那里几乎拥有一切

使用星号*运算符(也称为扩展运算符)将数组扩展到vararg内部函数。

https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs

添加 ?达到该值,您就可以开始了

fun <K, V : Any> Map<K, V?>.toVarargArray() = map { it.key to it.value }.toTypedArray()

    insert("", *mapOf("k" to "v").toVarargArray())
Run Code Online (Sandbox Code Playgroud)