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/

    10-11 22:30