假设我有一个人员名单,并且想要一个类型为
Map<String, Person>
的映射表,其中字符串是人名。我应该如何在Kotlin中实现这个呢?Map<String, Person>
的映射表,其中字符串是人名。我应该如何在Kotlin中实现这个呢?val list: List<Person> = listOf(Person("Ann", 19), Person("John", 23))
associateBy
函数可能会满足您的需求:
val map = list.associateBy({ it.name }, { it.age })
/* Contains:
* "Ann" -> 19
* "John" -> 23
*/
如KDoc所述,associateBy
:
返回一个
Map
,该Map
由给定数组的元素经过keySelector
函数和valueTransform
函数处理后得到的键值对组成。如果有两个或多个元素的
keySelector
函数返回相同的键,则只会将最后一个元素添加到Map
中。返回的
Map
保留原始数组的迭代顺序。
associateBy
适用于任何Iterable
。
toMap()
已经更改为 toMapBy()
,请您更新答案。 - Jayson MinardStream.collect
和Kotlin之间的其他等效方法,请参见https://dev59.com/v1sW5IYBdhLWcg3wuZRy - Jayson MinardtoMapBy
重载,它更接近于Collectors.toMap
。 - hotkeyList.toMapBy
... 可能是缺少了一个导入。然而,.keysToMap {transform(it)}
正是我要用来替换 .stream().collect(Collectors.toMap(Function.identity(), {transform(it)}))
的东西。 - TWiStErRobkeysToMap
或associateBy(identity(), {...})
(associateBy
可以,identity()
不行!)这两个函数都是Jetbrains内部的函数(org.jetbrains.kotlin.utils
),而不是公共的Kotlin API(kotlin.*
)。它们通过gradle-kotlin-dsl
和kotlin-compiler-embeddable
引入。依赖这些函数可能会导致ClassNotFoundExceptions异常。 - TWiStErRobKotlin 提供了许多替代方案 :)
val x: Map<String, Int> = list.associate { it.name to it.age }
val y: Map<String, Int> = list.map { it.name to it.age }.toMap()
var z: Map<String, Int> = list.associateBy({ it.name }, { it.age })