在Kotlin中编辑不可变 List 的最佳方法是什么?
List
我知道 List 实际上并不是不可变的,但是如果我将 List 传递给函数并且我需要整个列表减去单个元素,那么有没有一种支持的方法来处理它?如果我想要一个带有附加元素的整个列表呢?
如果您自己创建列表,而不是调用 listOf("foo", "bar") 调用 mutableListOf("foo", "bar") 来获取 MutableList 的实例 .
listOf("foo", "bar")
mutableListOf("foo", "bar")
MutableList
如果您获得列表,例如作为方法的参数,在其上调用 toMutableList() 以获得可变的 copy .
toMutableList()
或者,使用许多内置扩展方法之一(如 map() 或 filter() )来获取带有修改元素的 new 列表 . 例如,要获取不包含前n个元素的列表,请使用 drop(n) . 要仅获取前n个元素,请调用 take(n) . Here您可以找到更多内置扩展方法 .
map()
filter()
drop(n)
take(n)
如果您需要加入两个列表,只需使用加号运算符,如下所示: val newList = list1 + list2 .
val newList = list1 + list2
请注意,修改作为方法参数的列表可能会产生代码异味 . 这就是所有内置方法返回副本的原因 . 也是你的假设
我理解List实际上并不是不可变的
是错的 . 如您所见here,如果您在没有参数的情况下调用 listOf() ,标准库将返回一个不可变的空列表 .
listOf()
在Java中, List 接口在默认情况下是可变的,当您尝试修改不可变列表(例如通过调用 Arrays.asList() 创建的列表)时,可能会导致异常 . 这就是Kotlin的原因所在 .
Arrays.asList()
如果您正在处理不可变列表,那么您要做的是创建新列表 . 因此,在您的情况下,如果您想要一个没有元素的列表,那么过滤掉该元素(在Kotlin中您可以使用过滤器函数)并返回新列表 .
2 回答
如果您自己创建列表,而不是调用
listOf("foo", "bar")
调用mutableListOf("foo", "bar")
来获取MutableList
的实例 .如果您获得列表,例如作为方法的参数,在其上调用
toMutableList()
以获得可变的 copy .或者,使用许多内置扩展方法之一(如
map()
或filter()
)来获取带有修改元素的 new 列表 . 例如,要获取不包含前n个元素的列表,请使用drop(n)
. 要仅获取前n个元素,请调用take(n)
. Here您可以找到更多内置扩展方法 .如果您需要加入两个列表,只需使用加号运算符,如下所示:
val newList = list1 + list2
.请注意,修改作为方法参数的列表可能会产生代码异味 . 这就是所有内置方法返回副本的原因 . 也是你的假设
是错的 . 如您所见here,如果您在没有参数的情况下调用
listOf()
,标准库将返回一个不可变的空列表 .在Java中,
List
接口在默认情况下是可变的,当您尝试修改不可变列表(例如通过调用Arrays.asList()
创建的列表)时,可能会导致异常 . 这就是Kotlin的原因所在 .如果您正在处理不可变列表,那么您要做的是创建新列表 . 因此,在您的情况下,如果您想要一个没有元素的列表,那么过滤掉该元素(在Kotlin中您可以使用过滤器函数)并返回新列表 .