对 Kotlin 的 AssociateWith 映射转换扩展函数的文档感到困惑

M.E*_*.Ed 1 documentation collections transformation associate kotlin

尝试研究 Kotlin 中的集合转换,我对AssociateWith转换扩展函数的文档有点困惑。

它说:

基本关联函数 AssociateWith() 创建一个 Map,其中原始集合的元素是键,并且通过给定的转换函数从它们生成值。如果两个元素相等,则映射中仅保留最后一个元素

然而,当我使用包含重复元素的列表(即它们相等)测试此函数时,最后一个元素会从 map 中排除,只有第一个元素保留下来,这与文档中的内容相反。

fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "four")
val mapOfNumbers = numbers.associateWith { it.length }
println(mapOfNumbers) //the first "four" element is the one that remains in the map
}
Run Code Online (Sandbox Code Playgroud)

在 Kotlin Playground 中运行它会打印以下内容

{一=3,二=3,三=5,四=4,五=4}

文档中的措辞是否正确,或者我的思路是否遗漏了一些内容?

Jof*_*rey 5

最后一个被排除在地图之外,只剩下第一个

你没有观察你认为你在这里的东西。您正在查看地图内容的字符串表示形式。地图通常是无序的,因此查看顺序在这里没有帮助。LinkedHashMapKotlin大多数时候在此类 stdlib 函数中默认创建s,因此它保留插入顺序。即使第二个"four"覆盖第一个,它仍然会被放置在那个位置。

该文档的意思是,如果存在重复项,并且您的转换 lambda 为重复键提供了不同的值,则最后一个获胜。这里,您的 lambda 为相同的键提供相同的值,因此您无法使用当前代码测试文档的这一部分。

这是一个测试文档所说内容的示例:

val numbers = listOf("one", "two", "three", "four", "five", "four")

var order = 1
val mapOfNumbers = numbers.associateWith { order++ }
println(mapOfNumbers) // {one=1, two=2, three=3, four=6, five=5}
Run Code Online (Sandbox Code Playgroud)