2017-09-15 2323 views

回答

6

如果你有一个可变的集合:

val list = mutableListOf(1, 2, 3) 
list += 4 

如果你有一个不变的集合:

var list = listOf(1, 2, 3) 
list += 4 

请注意,我使用val作为可变列表来强调该对象总是相同的,但它的字nt改变。

在不可变列表的情况下,你必须使它成为var。具有附加值的+=运算符创建了一个新对象。

+2

在不可变列表中执行'+ =',需要将列表中的所有元素复制到新的可变列表中,然后将其重新分配给您的实际列表。我不知道这是合适的声明你的列表为'var'。无论如何,声明一个var对我来说不是一个好主意。 – crgarridos

+1

如果一个列表是不可变的,那么没有其他选项将其声明为'var'。如果一个不可变列表被声明为'val',那么列表不能永远改变。只是将它重新分配给另一个变量是可能的。 – guenhter

+0

的确,我不想允许改变我的变量的引用。它可能会在外部/并发任务中产生副作用。更好地创建一个副本来提取逻辑。但这不在问题的范围之内。 – crgarridos

3

如果你想专门用java的ArrayList,那么你可以做这样的事情:

fun initList(){ 
    val list: ArrayList<String> = ArrayList() 
    list.add("text") 
    println(list) 
} 

否则@guenhter答案是你正在寻找的人。

0

Kotlin中的收藏默认为只读,因此listOf,mapOf等返回集合,您无法添加元素。 例如,List<out T>是一个中央接口,其中out关键字指示元件T仅由产生的而不是consumed。结果,只有size,get等可以被调用。 MutableList<T>接口另一方面也可以消耗T s,即add是允许的。

val numbers: MutableList<Int> = mutableListOf(1, 2, 3) 
val readOnlyView: List<Int> = numbers 
println(numbers)  // prints "[1, 2, 3]" 
numbers.add(4) 
println(readOnlyView) // prints "[1, 2, 3, 4]" 
readOnlyView.clear() // -> does not compile 

正如你所看到的,STDLIB包括这样的可变(写)方法的集合,以及:mutableListOfmutableSetOf()

欲了解更多详情,请看看at the docs