如何在 Kotlin 中初始化 List<T>?

124

我看到 Kotlin 有一个 List<out E> 集合,我想知道初始化它的不同方式。在 Java 中,我可以写:

List<String> geeks = Arrays.asList("Fowler", "Beck", "Evans");

我该如何在Kotlin中实现相同的效果?


11
使用 listOf 吗? - Michael
7个回答

188

listOf这个顶层函数来帮助解决问题:

val geeks = listOf("Fowler", "Beck", "Evans")

14
调用 listOf 函数且不传递任何参数会得到一个空列表,或者可以直接调用 emptyList 函数以获得更清晰易读的代码。 - frogcoder
4
还有一个叫做 arrayListOf 的东西。 - Greg T
1
它是否可变以供后续修改? - IgorGanapolsky
2
@IgorGanapolsky 返回类型是只读的 List<T>,因此不应该假设它是可变的。 - Ilya

32

Ilyagmariotti 的答案都很好且正确。然而,一些替代方案分散在评论中,有些则未被提及。

本答案包括已经给出的总结,并加以澄清和其他几种替代方案。

不可变列表(List

不可变或只读列表是无法添加或删除元素的列表。

  • 正如Ilya所指出的那样,listOf()通常能够达到您的预期。这将创建一个类似于Java中的Arrays.asList的不可变列表。
  • 正如frogcoder在评论中所述,emptyList()也是相同的,但自然地返回一个空列表。
  • listOfNotNull()返回一个不包含所有null元素的不可变列表。

可变列表(MutableList

可变列表可以添加或删除元素。

  • gmariotti建议使用mutableListOf(),通常在需要添加或删除列表元素时使用此方法。
  • Greg T提供了另一种选择,arrayListOf()。这将创建一个可变的ArrayList。如果您确实需要一个ArrayList实现,请使用它而不是mutableListOf()
  • 对于其他没有任何便利函数的List实现,可以像val list = LinkedList<String>()那样初始化。这只是通过调用其构造函数来创建对象。仅在真正需要时使用,例如LinkedList实现。

1
只是一个补充:我经常需要一个带有泛型类型参数的可变列表。使用<String>或另一个类作为类型参数,例如val mutableList = mutableListOf<T>() - Hermann Schwarz

17

为了补充更多信息,Kotlin提供了不可变的List和可变的MutableList,可用listOfmutableListOf初始化。如果您对Kotlin在集合方面提供的内容更感兴趣,可以前往官方参考文档Collections


10

让我解释一些用例: 让我们创建一个不可变(非可变)列表并初始化项目:

val myList = listOf("one" , "two" , "three")

让我们创建一个包含初始化字段的可变列表:

val myList = mutableListOf("one" , "two" , "three")

让我们声明一个不可变的对象(无法更改),然后实例化它:

lateinit var myList : List<String>
// and then in the code :
myList = listOf("one" , "two" , "three")

最后,为每个项目添加一些额外的内容:

val myList = listOf("one" , "two" , "three")
myList.add() //Unresolved reference : add, no add method here as it is non mutable 

val myMutableList = mutableListOf("one" , "two" , "three")
myMutableList.add("four") // it's ok 

6
以这种方式,您可以在 Kotlin 中初始化 List。
val alphabates : List<String> = listOf("a", "b", "c")

2

在Kotlin中,还有一种构建列表的方法,截至目前为止仍处于实验状态,但希望很快会改变。

inline fun <E> buildList(builderAction: MutableList<E>.() -> Unit): List<E>

使用给定的builderAction填充MutableList并返回一个具有相同元素的只读列表,以此构建一个新的只读列表。 示例:
val list = buildList {
    testDataGenerator.fromJson("/src/test/resources/data.json").forEach {
        add(dao.insert(it))
    }
}

如需进一步阅读,请查看官方文档


1
如果您想在不指定类型的情况下进行初始化:
var temp: ArrayList<String> = ArrayList()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接