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}
文档中的措辞是否正确,或者我的思路是否遗漏了一些内容?
最后一个被排除在地图之外,只剩下第一个
你没有观察你认为你在这里的东西。您正在查看地图内容的字符串表示形式。地图通常是无序的,因此查看顺序在这里没有帮助。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)
| 归档时间: |
|
| 查看次数: |
1329 次 |
| 最近记录: |