Kotlin中groupingBy+aggregate生成的Map是否保证顺序?
Kotlin中groupingBy+aggregate的分组顺序是否有保证?
你的核心疑问是对的:aggregate返回的是Map类型,但Kotlin标准库中groupingBy配合aggregate得到的Map,其键的顺序是严格与输入列表中分组键首次出现的顺序一致的,所以你当前示例的结果顺序是完全有保障的,不需要依赖排序。
原因说明
Kotlin的groupingBy函数默认使用LinkedHashMap来存储分组结果(从Kotlin 1.1版本开始就是这个实现),而LinkedHashMap会维护键的插入顺序——也就是输入列表中每个分组键第一次出现的先后顺序。后续相同键的元素只会追加到对应分组的值中,不会改变键的顺序。
所以你调用.values.toList()时,得到的列表顺序就是输入列表中各个分组首次出现的顺序,完全符合你需要保留输入顺序的要求。
针对你的代码验证
你的示例输入列表中,分组键1先出现,之后才是2,因此分组结果的顺序必然是(1, [a, b])在前,(2, [c, d, e])在后,这个结果是稳定且有标准库实现保证的,和输入列表的顺序完全对应,不需要额外排序操作。
如果想要更明确地控制(比如避免未来版本的潜在变化,虽然可能性极低),也可以显式指定使用LinkedHashMap来收集结果:
val result = records.groupingBy { it.a } .aggregateTo(LinkedHashMap()) { _, acc: Pair<Int, List<String>>?, element, _ -> if (acc == null) { element.a to listOf(element.b) } else { acc.first to acc.second + element.b } }.values.toList()
不过这属于冗余操作,因为groupingBy的默认实现已经用了LinkedHashMap。
内容的提问来源于stack exchange,提问作者igr
相关产品推荐
相关产品推荐

