Kotlin: элегантный способ проверить, содержит ли список значение другой коллекции / списка? - PullRequest
0 голосов
/ 23 октября 2018

Есть ли элегантный / идиоматический способ проверить в 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 голосов
/ 23 октября 2018

Я согласен с Луи, что 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...