在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()
我只是想知道是否有更好的方法。
答案 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"))