例如,我有一个字符串列表:

val list = listOf("a", "b", "c", "d")

我想把它转换成一个映射,其中字符串是键。

我知道我应该使用. tomap()函数,但我不知道如何使用,而且我还没有看到它的任何示例。


当前回答

你可以使用associate来完成这个任务:

val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }

在本例中,list中的字符串成为键,它们对应的长度(作为示例)成为映射中的值。

其他回答

你有两个选择:

第一个也是性能最好的是使用associateBy函数,它接受两个lambdas来生成键和值,并内联创建映射:

val map = friends.associateBy({it.facebookId}, {it.points})

第二种,性能较差,使用标准map函数创建Pair列表,可由toMap使用该列表生成最终的map:

val map = friends.map { it.facebookId to it.points }.toMap()

你可以使用associate来完成这个任务:

val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }

在本例中,list中的字符串成为键,它们对应的长度(作为示例)成为映射中的值。

这在RC版本已经改变了。

我使用val map = list。groupByTo (destinationMap{。facebookId}, {it -> it。点})

在kotlin中将可迭代序列元素转换为映射 associate vs associateBy vs associateWith

*参考:芬兰湾的科特林文档

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 , ...}

来自Kotlin tips的例子:

带有关联函数的从列表到映射

在Kotlin 1.3中,List有一个名为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}
}    

使用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}
}