Kotlin 中val value: Map<Int, Int> = mapOf(A1 to B1,A2 to B2)

9 阅读2分钟

一句话结论

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)
)
  1. Key to Value 先合成一个 Pair<Key类型, Value类型>
  2. 把多个 Pair 传给 mapOf
  3. 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. 关键总结

  1. mapOf 的入参类型:只能是 Pair
  2. X to Y 只是简写,编译后就是 Pair(X,Y)
  3. to 本身不分 “key/value”,只是把左右两个值打包成一对;
  4. mapOf( A to B ) 这个特定语法里,A 自动成为 key、B 自动成为 value。