Kotlin学习之Map常用工具函数
kotlin.collections.Maps.kt文件中定义了许多针对Map接口的工具函数,其中大多数是涉及函数式编程的高阶函数。今天只是介绍几个简单的函数。
一、Pair类与to()函数
Map接口表示一种“键->值”的数据结构,一个键对应一个值。但是在实现时,Map并没有维护键和值两个结构,而是一个个Entry对象,每个Entry对象表示一个键与值的对应关系,有三个属性:key、value和hash,因为hash只与key有关,所以可以视为只有两个属性:key和value。
Kotlin为了简化Map的创建,定义了一个新类:Pair,相当于简化版的Map.Entry类:
上面的first相当于key、second相当于value,hashCode()充当了hash属性。
Kotlin还定义了一个to函数来创建Pair对象:
这是一个infix修饰的中缀函数,也是A类对象的扩展函数,它接受一个B类的参数,使用被扩展的A类对象和作为参数的B类对象创建一个Pair对象。
二、mapOf()与mutableMapOf()函数
Kotlin的Map接口也提供了生成不可变Map的mapOf()函数和生成可变Map的mutableMapOf()函数。Map接口的两个函数只接受Pair对象作为参数:
注意:
mapOf()和mutableMapOf()在元素数大于1时,都采用LinkedHashMap的实现方式。
linkedMapOf(pairs)是什么写法?这展开操作符,一般来说,给vararg函数传参数时,只能一个一个地传,如果想把一个数组传给vararg参数,可以在数组前面加个,告诉编译器“我不是把数组对象作为参数,而是把数组里的每个元素作为参数”。例如:
三、hashMapOf()与linkedMapOf()函数
hashMapOf()和LinkedMapOf()函数创建的都是可变Map:
四、解构函数
解构函数就是用operator关键字修饰的componentN()函数,这里的N是从1到5的整数。
Maps.kt中定义了两个解构函数:
都是Map.Entry的扩展函数,分别返回这个Entry的键和值,常用来遍历Map的键和值:
五、plus()与minus()函数
Map.kt重载了操作符+和-,方便进行增删元素。
所有plus()和minus()函数都是不可变的Map的扩展函数,所以每次调用plus()或minus()函数都会产生一个新的Map,这在Map内元素很多时可能会产生性能问题。
plus()和minus()函数有以下几种参数不同的重载形式:
Array
Iterable
:Pair集合
Pair:单个Pair对象
Sequence
:Pair序列
Map:另一个Map
对于MutableMap,Maps.kt重载了+=(plusAgain()函数)和-=(minusAssign()函数)操作符,分别相当于调用put()/putAll()函数和remove()/removeAll()函数:
六、toMap()函数
Map.kt还提供了一系列toMap()函数,用来将其它数据形式的Pair对象转换为可变的Map,包括如下两种重载形式:
支持Array
、Sequence
和Map四种数据结构转换为Map。
支持无参和一个destination参数两种形式,前者直接将转换得到Map赋给自身,后者则会把转换成Map赋给destination。
七、改进的putAll()函数
Maps.kt 给 MutableMap 重载了三个新的 putAll() 函数,它们分别接受 Array
和 Sequence
对象。
学海无涯苦作舟
领取专属 10元无门槛券
私享最新 技术干货