按值而不是按引用传递 List <String> 参数

Pass List <String> parameter by value instead of by reference

提问人:genespos 提问时间:11/11/2023 最后编辑:genespos 更新时间:11/12/2023 访问量:38

问:

我有这样的代码

val myFirstList = mutableListOf("Hello", "You can ", "edit, ", "run, ", "and share this code")
for (i in 0..myFirstList.size-2) {
    myFun(myFirstList)    
}

和这样的功能

fun myFun (myList: MutableList<String>){
    myList.removeAt(0)
    println(myList)
 }

输出为:

[您可以 、 编辑、 、 运行 和 共享此代码]

[编辑、运行和>共享此代码]

[运行、 和共享此代码]

[并分享此代码]

但我总是需要它(只删除了第一个字符串):

[您可以 、 编辑、 、 运行 和 共享此代码]

我找到了这样的解决方法:

myFun(myFirstList.toList().toMutableList())   

但我相信有一个更好的解决方案来按值而不是按引用传递列表。

提前感谢您的回答

列出 Kotlin 参数 - 传递 OnClickListener

评论

0赞 Mureinik 11/12/2023
如果您需要继续打印相同的列表,为什么要调用它?removeAt(0)
0赞 genespos 11/12/2023
@Mureinik 我只需要删除第一个字符串
1赞 Mureinik 11/12/2023
为什么不将其删除到循环之外呢?
0赞 genespos 11/12/2023
@Mureinik我在其他地方需要它,但我需要在有趣的执行中将其删除。仅从第二个字符串传递可能很有用,但如果没有大量代码,我无法做到这一点

答:

3赞 broot 11/12/2023 #1

谈到“按值传递列表”:不,没有更好的解决方案。您所说的“按值传递”实际上需要创建整个列表的完整副本。由于此类操作对资源的影响相当大,因此它不会隐式发生 - 我们必须显式执行。您可以跳过并仅保留: ,因此我们不会复制数据两次。toList()myFirstList.toMutableList()

但是,谈到您的具体情况,也许有比创建副本更好的选择,但这完全取决于您的需求。如果你总是只删除第一项,那么也许你应该做一次,在外面,并重复使用相同的,已经剪切的列表。您也可以尝试: .它创建列表的视图,因此它不会复制数据,而只是包装原始列表。但同样,这完全取决于您的具体情况。myFun()myList.subList(1, myList.size)

评论

0赞 genespos 11/12/2023
就我而言,我选择了(这就是我想要的)myList.subList