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

我看到 Kotlin 有一个 List<out E>集合,我想知道初始化它的不同方法。用爪哇语,我可以写:

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

How can I achieve the same in Kotlin?

120940 次浏览

listOf 顶级救援功能:

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

只是为了添加更多的信息,Kotlin 提供了不变的 ListMutableList,可以用 listOfmutableListOf初始化。如果您对 Kotlin 提供的收藏更感兴趣,您可以访问 收款的官方参考文档。

伊利亚格马里奥蒂的反对意见都是正确的。然而,有些替代方案在评论中散布开来,而有些则根本没有被提及。

这个答案包括对已经给出的答案的总结,以及澄清和一些其他的选择。

不可变列表(List)

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

  • As Ilya points out, listOf() often does what you want. This creates an immutable list, similar to Arrays.asList in Java.
  • As frogcoder states in a comment, emptyList() does the same, but naturally returns an empty list.
  • listOfNotNull() 返回不包含所有 null元素的不可变列表。

可变列表(MutableList)

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

  • Gmariotti 建议使用 mutableListOf(),当需要从列表中添加或删除元素时,通常需要使用 mutableListOf()
  • Greg T 给出了另一种选择 arrayListOf()。这将创建一个可变的 ArrayList。如果您真的想要一个 ArrayList实现,可以在 mutableListOf()上使用它。
  • 对于其他没有任何便利函数的 List实现,可以将它们初始化为例如 val list = LinkedList<String>()。这只是通过调用对象的构造函数来创建对象。只有在真正需要的情况下才使用它,例如,LinkedList实现。

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

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

let's create a Mutable (changeable) list with initializing fields :

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

这样,你可以在 Kotlin 初始化 List

val alphabates : List<String> = listOf("a", "b", "c")

There is one more way to build a list in Kotlin that is as of this writing in the experimental state but hopefully should change soon.

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))
}
}

为进一步阅读检查官方 医生

如果希望初始化时不使用 type:

var temp: ArrayList<String> = ArrayList()