我刚开始使用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。还是有可能需要一个用例呢?
答案 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} }或更糟糕的是,删除错误的元素(如果同时调用)。