Kotlin通常使用非常实用的方法。我想知道是否存在一些我不知道的简化请求谓语的过滤谓词。
例如。考虑以下列表:
val list = listOf("one", "two", "2", "three")
要过滤掉
"two"
和"2"
,可以通过几种方式完成过滤,例如:list.filter {
it in listOf("two", "2") // but that creates a new list every time... (didn't check though)
}
// extracting the list first, uses more code... and may hide the list somewhere sooner or later
val toCheck = listOf("two", "2")
list.filter { it in toCheck }
// similar, but probably less readable due to naming ;-)
list.filter(toCheck::contains)
// alternative using when, but that's not easier for this specific case and definitely longer:
list.filter {
when (it) {
"two", "2" -> true
else -> false
}
}
// probably one of the simplest... but not so nice, if we need to check more then 2 values
list.filter { it == "two" || it == "2" }
我想知道...是否有类似
list.filter { it in ("two", "2") }
或其他任何简单方法为已知值/常量创建/使用简短谓词的东西?最后,我只想检查一下。编辑:我刚刚意识到该示例没有多大意义,因为
listOf("anything", "some", "other").filter { it in listOf("anything") }
将始终只是:listOf("anything")
。但是,列表交集在处理例如一个Map
。在过滤器实际上不只返回过滤后的值的地方(例如.filterKeys
)。但是,减法(即list.filterNot { it in listOf("two", "2") }
)在列表中也很有意义。 最佳答案
Kotlin提供了一些集合操作
intersect
(两个集合的共同点)union
(组合两个集合)subtract
(不包含其他元素的集合)在您的情况下,可以使用set操作
subtract
来代替过滤器val filteredList = list.subtract(setOf("two","2"))
然后你去。
编辑:
并且乐趣(双关语意味不止于此):您可以使用自己的功能扩展集合,例如缺少
outerJoin
或过滤诸如without
或运算符之类的东西,即/
作为intersect
例如,通过添加这些
infix fun <T> Iterable<T>.without(other Iterable<T>) = this.subtract(other)
infix fun <T> Iterable<T>.excluding(other Iterable<T>) = this.subtract(other)
operator fun <T> Iterable<T>.div(other: Iterable<T>) = this.intersect(other)
您的代码-当使用相交应用于示例时,将变为
val filtered = list / filter //instead of intersect filter
或-而不是减去:
val filtered = list without setOf("two", "2")
要么
val filtered = list excluding setOf("two", "2")
实用吗?
关于kotlin - 检查多个已知值时简化谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52053755/