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

Lio*_*-On 3 kotlin

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

鉴于:

val listA = listOf("A", "B", "C")
Run Code Online (Sandbox Code Playgroud)

我可以写如下表达式:

listA.intersect(setOf("E", "C")).isNotEmpty()
Run Code Online (Sandbox Code Playgroud)

要么:

listA.any { it in listOf("E","C") }
Run Code Online (Sandbox Code Playgroud)

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

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

fun <T> List<T>.containsAny(vararg other : T) =
      this.intersect(other.toSet()).isNotEmpty()
Run Code Online (Sandbox Code Playgroud)

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

kco*_*ock 5

我同意Louis的setA.any { it in setB }可读性,它完全依赖于标准库函数。另外,您可以使用方法引用使其更加明确:

setA.any(setB::contains)
Run Code Online (Sandbox Code Playgroud)

进一步讲,您可以定义自己的扩展函数:

infix fun <T: Any> Set<T>.intersects(other: Set<T>) = any(other::contains)
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写:

if (setA intersects setB)
Run Code Online (Sandbox Code Playgroud)

编辑:给定您的更新问题,我会注意到此扩展功能可以缩放到任何集合类型,或者使用您的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)
Run Code Online (Sandbox Code Playgroud)

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

if (myList intersects setOf("1", "2", "3"))
Run Code Online (Sandbox Code Playgroud)

要么

if (myList.intersects("1", "2", "3"))
Run Code Online (Sandbox Code Playgroud)