gpt4 book ai didi

kotlin - 检查多个已知值时简化谓词

转载 作者:行者123 更新时间:2023-12-02 13:22:34 26 4
gpt4 key购买 nike

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com