在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中的只读列表,因此不会暴露任何变异函数(请参阅:语言引用中的Collections)。顺便说一句,对于支持随机访问的列表,有效地实现了这两个功能:然后,在删除每个项目之后(O(n2)时间最坏的情况),列表不会被压缩,而是将项目在列表中移动。被处理,给定O(n)时间。
而且,如果您不想修改原始列表,则可以使用
.filter { ... }
或 .filterNot { ... }
生成仅包含要保留的项目的单独集合,这也适用于只读List<T>
:val filtered = items.filter { shouldRetain(it) }
val filtered = items.filterNot { shouldRemove(it) }