提问者:小点点

移除所有和移除if的用例


我发现了这个:

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而不会有任何麻烦。或者有没有任何用例可能需要一个而不是另一个?


共3个答案

匿名用户

还有一个更重要的区别:

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版本的移除,第一个不是。

相关问题