一句话结论
mapOf(a to b) 本质是传入 Pair(a,b);to 只是创建 Pair 的语法糖。
1. 底层源码逻辑
Kotlin mapOf 接收可变参数:vararg pairs: Pair<K, V>函数签名简化:
kotlin
fun <K,V> mapOf(vararg pairs: Pair<K, V>): Map<K, V>
也就是说:mapOf 只能接收一堆 Pair 对象,没有单独传 key、value 的重载。
2. a to b = 等价 Pair(a,b)
to 是中缀函数,定义:
kotlin
infix fun <A,B> A.to(that: B): Pair<A,B> = Pair(this, that)
所以下面两行完全一模一样:
kotlin
mapOf( 1 to 2 )
mapOf( Pair(1, 2) )
3. 直观分层理解
kotlin
mapOf(
Key1 to Value1, // 等价 Pair(Key1,Value1)
Key2 to Value2 // 等价 Pair(Key2,Value2)
)
Key to Value先合成一个Pair<Key类型, Value类型>- 把多个 Pair 传给 mapOf
- mapOf 内部遍历所有 Pair,分别拿 pair.first 当 key、pair.second 当 value,生成 Map
var map: Map<Int, Int> = mapOf(
1 to 101,
2 to 102,
3 to 103
)
var value = map[1] //返回101;
var value = map[2] //返回102;
var value = map[101] //返回null;
4. 区分两种完全不同的 Pair 场景(你项目里都出现过)
场景 1:Pair 作为 mapOf 的参数(键值分隔)
kotlin
// Map<Int, Int>
mapOf(AreaType.GLOBAL to VehicleZone.ZONE_ALL)
这里 A to B:A=key,B=value
场景 2:Pair 作为 Map 的 Key(复合主键)
kotlin
// Map<Pair<Int,Int>, MappingData>
val idMap = mutableMapOf()
idMap[propId to areaId] = MappingData()
这里 propId to areaId 整体是一个 Pair,充当 Map 的 key,和 value 无关。
5. 对比 Java 帮助理解
Java 没有 to 和 Pair,只能手动 put:
java
运行
Map<Integer, Integer> map = new HashMap<>();
map.put(key, value);
Kotlin 的 mapOf(key to value) 只是简化初始化写法,底层依然靠 Pair 承载一组 key-value。
6. 关键总结
mapOf的入参类型:只能是 Pair;X to Y只是简写,编译后就是Pair(X,Y);to本身不分 “key/value”,只是把左右两个值打包成一对;- 在
mapOf( A to B )这个特定语法里,A 自动成为 key、B 自动成为 value。