removeall和removeif的用例

时间:2018-08-02 12:37:24

标签: 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 }

    list.removeIf { x -> x in 1..3 }
}

它们都产生相同的输出

4
5

尽管我知道removeAll是Kotlin,removeIf是Java,但我不明白为什么在removeIf已经存在的情况下removeAll在那里?而且我们可以在Kotlin中轻松使用removeIf。还是有可能需要一个用例呢?

3 个答案:

答案 0 :(得分:5)

从Java 1.8开始就有Java的removeIf()。

科特琳(Kotlin)从2011年开始(wikipedia)。 Java 1.8出现在2014年。

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

答案 1 :(得分:2)

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

如果您阅读该文档,可以看到可以通过提供一个集合来使用此功能:

fun <T> MutableCollection<out T>.removeAll(
    elements: Collection<T>
): Boolean (source)

或提供过滤功能:

fun <T> MutableIterable<T>.removeAll(
    predicate: (T) -> Boolean
): Boolean (source)

所以,第二个类似于removeIf的Java版本,第一个不是。

答案 2 :(得分:1)

还有一个重要的区别:

removeIf上调用CopyOnWriteArrayList是线程安全的,但是removeAll并不是

看代码,removeIf有一个针对CopyOnWriteArrayList的自定义实现,但是removeAll 迭代索引,最终会抛出{{1} }或更糟糕的是,删除错误的元素(如果同时调用)。