You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么不能在.copyOf()之后链式调用.sort()方法?

为什么Kotlin中数组的copyOf().sort()链式调用会导致代码无法运行?

这个问题的核心在于Kotlin数组的sort()方法的返回值特性——它是原地排序方法,返回的是Unit(相当于Java里的void),而不是你期望的排序后的数组。

两段代码的本质区别

先拆解第一段能正常运行的代码:

var heights = arrayOf(1,2,3,4,2,3,4)
var sortedHeights = heights.copyOf()
sortedHeights.sort()
for (i in 0..heights.size-1) {
    println(sortedHeights[i])
}
  • heights.copyOf()确实返回了一个新的数组副本,类型是Array<Int>,并把这个数组赋值给了sortedHeights。
  • 调用sortedHeights.sort()时,这个方法会直接修改sortedHeights指向的数组本身(原地排序),但它的返回值是Unit——也就是没有返回值。这时候sortedHeights仍然指向那个被排序后的数组,所以后续循环能正常输出。

再看第二段无法运行的代码:

var heights = arrayOf(1,2,3,4,2,3,4)
var sortedHeights = heights.copyOf().sort()
for (i in 0..heights.size-1) {
    println(sortedHeights[i])
}
  • heights.copyOf()生成新数组后,立刻调用了sort(),但sort()返回的是Unit,所以sortedHeights的实际类型是Unit,而不是数组。当你尝试用sortedHeights[i]访问下标时,Unit类型根本没有这个操作,自然会编译报错,代码无法运行。

想要链式调用的解决方案

如果希望通过链式调用得到排序后的数组,你需要使用非原地排序的方法:

  • 若要返回新的List<Int>,用sorted():
    var sortedHeights = heights.copyOf().sorted()
    
  • 若要返回新的Array<Int>,用sortedArray():
    var sortedHeights = heights.copyOf().sortedArray()
    
    甚至不需要先调用copyOf(),因为sorted()和sortedArray()本来就会返回新的集合/数组,不会修改原数组:
    var sortedHeights = heights.sortedArray()
    

关键总结

  • 原地排序方法(如sort()):直接修改原集合/数组,返回Unit,不能用于链式赋值。
  • 非原地排序方法(如sorted()、sortedArray()):返回新的排序后的集合/数组,可以安全地链式调用并赋值给变量。

内容的提问来源于stack exchange,提问作者dattebane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:07:57