我刚开始使用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。还是有可能需要一个使用案例?
还有一个更重要的区别:
调用removeIfaCopyOnWriteArrayList是线程安全的,但removeAll不是。
查看代码,removeIf有一个 的自定义实现CopyOnWriteArrayList,但removeAll 会迭代索引,最终会抛出ArrayIndexOutOfBoundsException异常,甚至更糟糕的是,如果同时调用,会删除错误的元素。
这些是非常不同的函数,但是在 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 版本,第一个不是。
| 归档时间: |
|
| 查看次数: |
3549 次 |
| 最近记录: |