Answers:
您有两种选择:
最有效的方法是使用associateBy
需要两个lambda才能生成键和值的函数,并内联地图的创建:
val map = friends.associateBy({it.facebookId}, {it.points})
第二个性能较低的方法是使用标准map
函数创建一个列表,Pair
以toMap
供生成最终地图使用:
val map = friends.map { it.facebookId to it.points }.toMap()
Pair
对于大型集合而言,实例的分配 可能会非常昂贵
List
到Map
具有associate
功能在Kotlin 1.3中,List
有一个名为的功能associate
。associate
具有以下声明:
fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>
返回
Map
由transform
函数提供给给定集合的元素的包含键值对的键。
用法:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associate({ Pair(it.id, it.name) })
//val map = friends.associate({ it.id to it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
List
到Map
具有associateBy
功能使用Kotlin,List
有一个名为的功能associateBy
。associateBy
具有以下声明:
fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>
返回一个,
Map
其中包含valueTransform
由keySelector
应用于给定集合的元素的函数提供的值并由该函数索引。
用法:
class Person(val name: String, val id: Int)
fun main() {
val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
//val map = friends.associateBy({ it.id }, { it.name }) // also works
println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
*参考:Kotlin文档
1-关联(同时设置键和值):构建可以设置键和值元素的地图:
IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}
如果两对中的任何一个具有相同的密钥,则最后一个将添加到映射中。
返回的映射保留原始数组的输入迭代顺序。
2-associateBy(通过计算仅设置键):建立一个可以设置新键的映射,将为值设置类似元素
IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set from analogous IterableSequenceElements' ,...}
3- associateWith(通过计算仅设置值):建立一个可以设置新值的映射,将为键设置类似元素
IterableSequenceElements.associateWith { newValue } //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}
如果您不想丢失重复列表,可以使用进行操作groupBy
。
否则,就像其他人说的那样,使用associate/By/With
(我相信,如果重复,则只会返回该键的最后一个值)。
一个按年龄分组人员列表的示例:
class Person(val name: String, val age: Int)
fun main() {
val people = listOf(Person("Sue Helen", 31), Person("JR", 25), Person("Pamela", 31))
val duplicatesKept = people.groupBy { it.age }
val duplicatesLost = people.associateBy({ it.age }, { it })
println(duplicatesKept)
println(duplicatesLost)
}
结果:
{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}