Kotlin:一种检查列表是否包含另一个Collection / List值的优雅方法?

时间:2018-10-23 18:26:00

标签: kotlin

在Kotlin中是否有一种优雅/惯用的方式来检查一个列表中的元素是否包含在另一个列表中?

给出:

val listA = listOf("A", "B", "C")

我可以写如下表达式:

listA.intersect(setOf("E", "C")).isNotEmpty()

或:

listA.any { it in listOf("E","C") }

可以,但是我想知道是否还有一种更流畅的方式来表达它(因为此代码经过简化,所以实际代码更加复杂)。

我的后备目标是使用自定义扩展功能,例如:

fun <T> List<T>.containsAny(vararg other : T) =
      this.intersect(other.toSet()).isNotEmpty()

我只是想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:3)

我同意路易斯的观点,setA.any { it in setB }看起来很易读,并且仅依赖于标准库函数。另外,您可以使用方法引用使其更明确:

setA.any(setB::contains)

再往前走,您可以定义自己的扩展功能:

infix fun <T: Any> Set<T>.intersects(other: Set<T>) = any(other::contains)

然后您可以编写:

if (setA intersects setB)

编辑:考虑到您的更新问题,我会注意到此扩展功能可以扩展到任何集合类型,或者使用您的varargs方法:

infix fun <T: Any> Collection<T>.intersects(other: Collection<T>) = any(other::contains)
fun <T: Any> Collection<T>.intersects(vararg others: T) = any(other::contains)

因此您仍然可以执行以下操作:

if (myList intersects setOf("1", "2", "3"))

if (myList.intersects("1", "2", "3"))