Kotlin初始化玩家分数Map:能否避免使用toTypedArray与展开运算符*?
嘿,这个问题我之前也碰到过!确实每次写.toTypedArray()有点啰嗦,其实有几个更简洁的办法可以避开这个操作,咱们一步步来看:
1. 单个集合生成分数Map的场景
先猜一下你原来的代码大概是这样的:
val players = listOf("Alice", "Bob", "Charlie") val scoreMap = mapOf(*players.map { it to 0 }.toTypedArray())
其实Kotlin标准库已经给我们准备了更顺手的API——associate函数,它专门用来把集合元素转换成键值对并直接生成Map:
val scoreMap = players.associate { it to 0 }
这个写法直接返回Map<String, Int>,完全不需要展开运算符和数组转换,代码一下子清爽多了。
2. 两个数组/集合Zip生成Map的场景
如果是用两个数组Zip来生成Map的情况,比如你原来的代码可能是:
val playerNames = arrayOf("Alice", "Bob") val initialScores = arrayOf(0, 0) val scoreMap = mapOf(*playerNames.zip(initialScores).toTypedArray())
这里直接用toMap()就能解决问题:
val scoreMap = playerNames.zip(initialScores).toMap()
要是你需要自定义键值对的转换逻辑,也可以用associate来实现:
val scoreMap = playerNames.zip(initialScores).associate { (name, score) -> name to score }
为什么原来需要.toTypedArray()?
顺便说下背后的原因:mapOf()的参数是可变参数Pair<K, V>...,而map()或者zip()返回的是List<Pair<K, V>>。Kotlin的展开运算符*只能作用于数组类型,所以必须把List转成TypedArray才能传入mapOf()。而上面提到的associate和toMap都是直接从集合生成Map的API,绕开了可变参数的限制,自然就不需要额外的数组转换步骤了。
内容的提问来源于stack exchange,提问作者blubb
相关产品推荐
相关产品推荐

