← Назад к вопросам

Как получить первый элемент, ключ которого равен какому-то значению в Kotlin?

1.6 Junior🔥 142 комментариев
#Kotlin основы#Коллекции и структуры данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Получение первого элемента по ключу в Kotlin

В Kotlin существует несколько подходов в зависимости от типа коллекции и конкретных требований к поиску. Рассмотрим основные сценарии.

Поиск в Map (ассоциативном массиве)

Если речь идет о структуре Map, где ключи уникальны, получить значение по ключу можно напрямую через оператор [] или метод get():

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

// Способ 1: Оператор []
val value1 = map["b"] // Возвращает 2

// Способ 2: Метод get()
val value2 = map.get("b") // Возвращает 2

// Способ 3: С обработкой отсутствия ключа
val value3 = map.getOrDefault("d", 0) // Вернет 0, так как ключа нет
val value4 = map["d"] ?: -1 // Вернет -1 через elvis-оператор

Поиск в List или других последовательностях

Для поиска первого элемента, удовлетворяющего определенному условию по ключу (или любому другому свойству), используются функции высшего порядка:

data class Person(val id: Int, val name: String)

val people = listOf(
    Person(1, "Анна"),
    Person(2, "Борис"),
    Person(3, "Анна") // Дублирование имени
)

// Найти первого человека с именем "Анна"
val firstAnna = people.first { it.name == "Анна" } // Person(id=1, name="Анна")

// Безопасная версия с обработкой исключения
val result = people.firstOrNull { it.name == "Мария" } // Вернет null вместо исключения

// С использованием find() (синоним firstOrNull)
val sameResult = people.find { it.name == "Мария" } // Также вернет null

Важные нюансы:

  • first() бросит NoSuchElementException, если подходящий элемент не найден
  • firstOrNull() и find() вернут null при отсутствии элемента, что безопаснее
  • Для коллекций с возможной null-безопасностью используйте firstNotNullOf() или firstNotNullOfOrNull()

Поиск по индексу в упорядоченных коллекциях

Если под "ключом" подразумевается индекс, используйте:

val list = listOf("первый", "второй", "третий")

// Прямой доступ по индексу (только для List)
val element = list[0] // "первый"

// Безопасный доступ
val safeElement = list.getOrNull(5) // null, так как индекс вне границ
val withDefault = list.getOrElse(5) { "значение по умолчанию" }

Поиск в Set и других коллекциях

Для Set принцип аналогичен List, но учитывайте, что Set не гарантирует порядок элементов:

val set = setOf("яблоко", "банан", "апельсин")
val fruit = set.firstOrNull { it.startsWith("ап") } // "апельсин"

Производительность и рекомендации

  1. Для Map поиск по ключу происходит за O(1) в среднем случае
  2. Для List и Set first() и firstOrNull() выполняют линейный поиск O(n)
  3. Если нужен быстрый поиск по определенному полю, рассмотрите преобразование в Map:
// Преобразование List в Map для быстрого поиска
val peopleById = people.associateBy { it.id }
val person = peopleById[2] // Мгновенный доступ по ID

Вывод

Выбор метода зависит от контекста:

  • Уникальные ключи → используйте Map и оператор []
  • Поиск по условиюfirstOrNull() или find() для безопасности
  • Гарантированное наличиеfirst() с обработкой исключений
  • Работа с индексамиget() или getOrNull() для List

Все эти методы являются частью стандартной библиотеки Kotlin и поддерживают null-безопасность и функциональный стиль программирования, что соответствует философии языка.

Как получить первый элемент, ключ которого равен какому-то значению в Kotlin? | PrepBro