如何用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) }