如何用Kotlin就地过滤列表?

在Java中,我可以使用以下代码从列表中删除项目:

private void filterList(List<Item> items) { Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { if (checkItem(iterator.next())) { iterator.remove(); } } } 

如何使Kotlin相同(即删除List中的一些项目,无需重新创建)?

只要使用.retainAll { ... }.removeAll { ... } ,都接受一个谓词,就地过滤它:

 items.retainAll { shouldRetain(it) } 

 items.removeAll { shouldRemove(it) } 

请注意, items应该是MutableList<T> ,而不仅仅是List<T> ,它是Kotlin中的只读列表,因此不公开任何突变函数(请参阅:语言参考中的集合 )。

顺便说一句,对于支持随机访问的列表,这两个函数是有效实现的:那么在删除每个项目( O(n 2时间最差的情况)之后,列表不会被压缩,而是项目在列表中被移动它被处理,给O(n)时间。


如果您不想修改原始列表,则可以使用.filter { ... }.filterNot { ... }生成一个单独的集合,只保留要保留的项目,只有List<T>

 val filtered = items.filter { shouldRetain(it) } 

 val filtered = items.filterNot { shouldRemove(it) } 

Kotlin有许多简洁的内置功能。 你可以尝试在这里使用filter

 val filteredItems = items.filter { checkItem(it) } 

不幸的是,它会重新创建列表。 这个API的目的是为了避免额外的可变性。

但是如果你仍然想继续MutableList使用retainAll方法

 items.retainAll { checkItem(it) }