我发现了这个:
fun main() {
val list: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
list.removeAll { x -> x in 1..3 } // [4, 5]
list.removeIf { x -> x in 1..3 } // [4, 5]
}
两者都得出了相同的结果。
虽然我理解RemoveAll
是静态编程语言,RemoveIF
是Java但是我不明白为什么RemoveAll
已经存在了?
事实上,我们可以在静态编程语言中使用RemoveIF
而不会有任何麻烦。或者有没有任何用例可能需要一个而不是另一个?
还有一个更重要的区别:
在CopyOnWriteArrayList
上调用移除如果
是线程安全的,但移除所有
不是。
查看代码,RemoveIF
有一个CopyOnWriteArrayList
的自定义实现,但是RemoveAll
遍历索引,最终会抛出ArrayIndexOfBoundsException
甚至更糟,如果并发调用,会删除错误的元素。
Java的RemoveIF()
从Java1.8开始就存在了。
静态编程语言始于2011年(维基百科),Java1.8出现在2014年。
我不确定静态编程语言的RemoveAll(谓词)
是何时指定和实现的,但是它可能早于Java的RemoveIF()
。
这些是非常不同的函数,但在kotlin中,该方法是重载的,这意味着它有两种不同类型的函数参数。
如果您阅读文档,您可以看到您可以通过给出集合来使用此函数:
fun <T> MutableCollection<out T>.removeAll(
elements: Collection<T>
): Boolean (source)
或者给一个函数来过滤:
fun <T> MutableIterable<T>.removeAll(
predicate: (T) -> Boolean
): Boolean (source)
所以,第二个就像Java版本的移除,第一个不是。