removeall和removeif的用例

Yog*_*esh 7 java kotlin

我刚开始使用Kotlin,并且在进行实验时发现:

fun main(args: Array<String>) {
    val list: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
    list.removeAll { x -> x in 1..3 }
Run Code Online (Sandbox Code Playgroud)

    list.removeIf { x -> x in 1..3 }
}
Run Code Online (Sandbox Code Playgroud)

它们都导致相同的输出

4
5
Run Code Online (Sandbox Code Playgroud)

虽然我知道removeAll是Kotlin,removeIf是Java,但是我不明白为什么当removeIf已经存在时removeAll在那里?而且我们可以在Kotlin中轻松使用removeIf。还是有可能需要一个使用案例?

Ste*_*ack 7

还有一个更重要的区别:

调用removeIfaCopyOnWriteArrayList线程安全的,但removeAll不是

查看代码,removeIf有一个 的自定义实现CopyOnWriteArrayList,但removeAll 会迭代索引,最终会抛出ArrayIndexOutOfBoundsException异常,甚至更糟糕的是,如果同时调用,会删除错误的元素。


Mat*_*tej 6

自Java 1.8起就有Java的removeIf()。

Kotlin于2011年开始(Wikipedia)。Java 1.8于2014年问世。

我不确定何时指定和实现Kotlin的removeAll(predicate),但是它可能早于Java的removeIf()。

  • Android 的后续内容是 Java 的 removeIf 仅适用于 API 24+ 而 Kotlin 的 removeAll 将在较旧的 API 上运行 (4认同)

Dam*_*ero 6

这些是非常不同的函数,但是在 kotlin 中,该方法是重载的,这意味着它有两种不同类型的函数参数。

如果你阅读文档,你可以看到你可以通过提供一个集合来使用这个函数:

fun <T> MutableCollection<out T>.removeAll(
    elements: Collection<T>
): Boolean (source)
Run Code Online (Sandbox Code Playgroud)

或者给出一个过滤函数:

fun <T> MutableIterable<T>.removeAll(
    predicate: (T) -> Boolean
): Boolean (source)
Run Code Online (Sandbox Code Playgroud)

所以,第二个就像 removeIf 的 Java 版本,第一个不是。