今天在翻看WanAndroid源码的时候,发现有个莫名其妙的*号。很好奇,这是有什么功能?
然后查了一下。星号的作用是,在数组对象前加*号可以将数组展开,以方便传值。
在源代码中是这样的:
override fun saveAll(cookies: Collection<Cookie>) {
applicationScope.launch(ioDispatcher) {
cookieDataStore.edit { preferences ->
preferences.putAll(
*cookies.map {
stringPreferencesKey(it.key) to Json.encodeToString(CookieSerializer, it)
}.toTypedArray()
)
}
}
}
下面的代码就是生成一个Array<Pair>数组。
cookies.map {
stringPreferencesKey(it.key) to Json.encodeToString(CookieSerializer, it)}.toTypedArray()
我们看下putAll的源码:
public fun putAll(vararg pairs: Preferences.Pair<*>) {
checkNotFrozen()
pairs.forEach {
setUnchecked(it.key, it.value)
}
}
vararg是可变长度参数。 也就是说,Array<Pair>数组的成员会一个一个的传进去。别误会Pair<*>里的*, 和本文讲的作用不一样,而和java的泛型<?>一样的作用。
再看下面简单的例子,就全明白了:
var temp = arrayOf("1" , "2" , "3")
showItems(*temp)
fun showItems(vararg items:String){
items.forEach {
ToastUtils.showLong(it)
}
}
算是比较冷门的知识了。