在 Java 中,我们可以执行以下操作
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
但是如果我们像下面这样直接改写成Kotlin
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
我收到无法从我的列表中找到add
和运行的错误remove
我解决了将它转换为 ArrayList 的问题,但是需要转换它很奇怪,而在 Java 中则不需要转换。这违背了拥有抽象类 List 的目的
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
有没有一种方法可以让我使用 List 但不需要转换它,就像在 Java 中可以做的那样?
与许多语言不同,Kotlin 区分可变和不可变集合(列表、集合、映射等)。精确控制何时可以编辑集合对于消除错误和设计良好的 API 非常有用。
https://kotlinlang.org/docs/reference/collections.html
你需要使用一个MutableList
列表。
class TempClass {
var myList: MutableList<Int> = mutableListOf<Int>()
fun doSomething() {
// myList = ArrayList<Int>() // initializer is redundant
myList.add(10)
myList.remove(10)
}
}
MutableList<Int> = arrayListOf()
也应该工作。
在 Kotlin 中以不同方式定义 List 集合:
具有不可变(只读)列表的不可变变量:
val users: List<User> = listOf( User("Tom", 32), User("John", 64) )
具有可变列表的不可变变量:
val users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
或没有初始值 - 空列表且没有显式变量类型:
val users = mutableListOf<User>() //or val users = ArrayList<User>()
- 您可以将项目添加到列表中:
users.add(anohterUser)
或者users += anotherUser
(在引擎盖下users.add(anohterUser)
)
- 您可以将项目添加到列表中:
具有不可变列表的可变变量:
var users: List<User> = listOf( User("Tom", 32), User("John", 64) )
或没有初始值 - 空列表且没有显式变量类型:
var users = emptyList<User>()
- 注意:您可以添加*项目到列表:
users += anotherUser
- *它创建新的 ArrayList 并将其分配给users
- 注意:您可以添加*项目到列表:
具有可变列表的可变变量:
var users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
或没有初始值 - 空列表且没有显式变量类型:
var users = emptyList<User>().toMutableList() //or var users = ArrayList<User>()
- 注意:您可以将项目添加到列表中:
users.add(anohterUser)
- 但不使用
users += anotherUser
错误:Kotlin:赋值运算符歧义:
public operator fun Collection.plus(element: String): List defined in kotlin.collections
@InlineOnly public inline operator fun MutableCollection.plusAssign(element: String): Unit defined in kotlin.collections
- 注意:您可以将项目添加到列表中:
同意以上所有使用 MutableList 的答案,但您也可以从列表中添加/删除并获得如下所示的新列表。
val newListWithElement = existingList + listOf(element)
val newListMinusElement = existingList - listOf(element)
或者
val newListWithElement = existingList.plus(element)
val newListMinusElement = existingList.minus(element)
显然,Kotlin 的默认列表是不可变的。要有一个可以改变的列表,应该使用如下的 MutableList
class TempClass {
var myList: MutableList<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
已更新 尽管如此,除非您确实想要更改列表,否则不建议使用 MutableList。请参阅https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359了解只读集合如何提供更好的编码。
在 Kotlin 中你必须使用MutableList
or ArrayList
。
让我们看看这些方法是如何
MutableList
工作的:
var listNumbers: MutableList<Int> = mutableListOf(10, 15, 20)
// Result: 10, 15, 20
listNumbers.add(1000)
// Result: 10, 15, 20, 1000
listNumbers.add(1, 250)
// Result: 10, 250, 15, 20, 1000
listNumbers.removeAt(0)
// Result: 250, 15, 20, 1000
listNumbers.remove(20)
// Result: 250, 15, 1000
for (i in listNumbers) {
println(i)
}
让我们看看这些方法是如何
ArrayList
工作的:
var arrayNumbers: ArrayList<Int> = arrayListOf(1, 2, 3, 4, 5)
// Result: 1, 2, 3, 4, 5
arrayNumbers.add(20)
// Result: 1, 2, 3, 4, 5, 20
arrayNumbers.remove(1)
// Result: 2, 3, 4, 5, 20
arrayNumbers.clear()
// Result: Empty
for (j in arrayNumbers) {
println(j)
}
更新:从 Kotlin 1.3.70 开始,标准库中提供了以下确切buildList
函数作为实验函数,以及它的类似物和. 请参阅https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/。buildSet
buildMap
将可变性限制在构建器中
这里的最佳答案正确地说明了 Kotlin 中只读List
(注意:它是只读的,而不是“不可变的”)和MutableList
.
一般来说,应该尽量使用只读列表,然而,可变性在构造时仍然经常有用,尤其是在处理具有非功能接口的第三方库时。对于替代构造技术不可用的情况,例如直接使用,或应用类似orlistOf
的功能构造,一个简单的“构建器函数”构造如下所示很好地从临时可变列表生成只读列表:fold
reduce
val readonlyList = mutableListOf<...>().apply {
// manipulate your list here using whatever logic you need
// the `apply` function sets `this` to the `MutableList`
add(foo1)
addAll(foos)
// etc.
}.toList()
这可以很好地封装到可重用的内联实用程序函数中:
inline fun <T> buildList(block: MutableList<T>.() -> Unit) =
mutableListOf<T>().apply(block).toList()
可以这样调用:
val readonlyList = buildList<String> {
add("foo")
add("bar")
}
现在,所有的可变性都被隔离到一个用于构建只读列表的块范围内,其余代码使用构建器输出的只读列表。
你可以像这样创建一个新的。
var list1 = ArrayList<Int>()
var list2 = list1.toMutableList()
list2.add(item)
现在你可以使用list2了,谢谢。
https://kotlinlang.org/docs/reference/collections.html
根据上面的链接,List<E> 在 Kotlin 中是不可变的。然而,这会起作用:
var list2 = ArrayList<String>()
list2.removeAt(1)
Alist
是immutable
by Default
,你可以改用ArrayList
。像这样 :
val orders = arrayListOf<String>()
然后你可以add/delete
像下面这样从这个项目:
orders.add("Item 1")
orders.add("Item 2")
默认情况下,
ArrayList
您mutable
可以对其执行操作。