关联 转换允许从集合元素和与其关联的某些值构建 Map。 在不同的关联类型中,元素可以是关联 Map 中的键或值。
- 基本的关联函数
associateWith()
创建一个Map
,其中原始集合的元素是键,并通过给定的转换函数从中产生值。 如果两个元素相等,则仅最后一个保留在 Map 中
val numbers = listOf("one", "two", "three", "three")
println(numbers.associateWith { it.length })
------>result
{one=3, two=3, three=5}
- 为了使用集合元素作为值来构建 Map,有一个函数
associateBy()
。 它需要一个函数,该函数根据元素的值返回键。如果两个元素相等,则仅最后一个保留在 Map 中。 还可以使用值转换函数来调用associateBy()
。
val numbers = listOf("one", "two", "three", "four")
println(numbers.associateBy { it.first().toUpperCase() })
println(numbers.associateBy(keySelector = { it.first().toUpperCase() }, valueTransform = { it.length }))
------>result
{O=one, T=three, F=four}
{O=3, T=5, F=4}
- 另一种构建 Map 的方法是使用函数
associate()
,其中 Map 键和值都是通过集合元素生成的。 它需要一个 lambda 函数,该函数返回Pair
:键和相应 Map 条目的值。
请注意,associate()
会生成临时的 Pair
对象,这可能会影响性能。 因此,当性能不是很关键或比其他选项更可取时,应使用 associate()
。
data class FullName(val firstName: String, val lastName: String)
fun parseFullName(fullName: String): FullName {
val nameParts = fullName.split(" ")
if (nameParts.size == 2) {
return FullName(nameParts[0], nameParts[1])
} else throw Exception("Wrong name format")
}
val names = listOf("Alice Adams", "Brian Brown", "Clara Campbell")
println(names.associate { name -> parseFullName(name).let { it.lastName to it.firstName } })
------> result
{Adams=Alice, Brown=Brian, Campbell=Clara}
同上需要建立转换函数parseFullName 并且定义解构 data
网友评论