是否有一种优雅/惯用的方式来检查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)
我只是想知道是否有更好的方法。
我同意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)
| 归档时间: |
|
| 查看次数: |
693 次 |
| 最近记录: |