Шпаргалка по Kotlin ч. 1 Колекції

В першій частині хочу написати про колеції та їх функції, які мало хто використовує, але можуть бути дуже корисними в написанні коду.

Якщо вам цікаво детальніше почитати - ось тут посилання на документацію

Актуальні колекції в Kotlin:

  • List - впорядкована колекція з доступом за індексом

  • Set - колекція унікальних елементів

  • Map - набір ключ-значення

Ці колекції є двох типів:

  • read-only - раз створив і все

  • mutable - дозволяють видаляти та додавати елементи в колекції

Collection interfaces hierarchy
Діаграмка з документації

Дефолтні імплементації:

  • MutableList - це ArrayList

  • MutableSet - це LinkedHashSet

  • MutableMap - це LinkedHashMap

1/ partition - функція, яка дозволяє розділити колекції на два списки

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// Split the numbers into two lists, one containing even numbers and the other containing odd numbers. 
val (evens, odds) = numbers.partition { it % 2 == 0 }

Тут можемо наш список розділити на два за певної умови. Для прикладу нам треба показати окремо переглянуті новини та нові. Ми не фільтруємо двічі, а за допомогою однієї функції отримуємо два списки.

2/ associateWith - функція, яка повертає Map, де ключі є символами з заданої послідовності, а значення створюються функцією valueSelector

fun main(args: Array<String>) {
  // Create a list of words
  val words = listOf("a", "abc", "ab", "def", "abcd")

  // Use the `associateWith` function to create a map where the keys are the words and the values are their lengths
  val withLength = words.associateWith { it.length }

  // Print the keys and values of the map
  println(withLength.keys) // [a, abc, ab, def, abcd]
  println(withLength.values) // [1, 3, 2, 3, 4]
}

Уявімо, що нам треба знати індекс першої новини в списку залежно від того, по якому дню натисне користувач. Комбінуємо з groupBy, який погрупує за днем. Потім через associateWith шукаємо перший індекс через indexOfFirst.

3/ zipWithNext - функція приймає послідовність і повертає список пар сусідніх елементів послідовності.

val values = listOf(1, 4, 9, 16, 25, 36)
val deltas = values.zipWithNext { tail, head -> head - tail }

println(deltas) // [3, 5, 7, 9, 11]

Ця функція дозволяє нам отримати наступний елемент та вибраний. Так ми можемо створити новий список. Для прикладу, нам треба показувати в списку, що це остання новина, яка була в пений день тижня. Перевіряємо настуну новину, якщо вона відбулася наступного дня, значить ми можемо модифікувати наш елемент.

4/ distinct та distinctBy- функція вилучення дублікатних елементів з колекції

fun main(args: Array<String>) {
  val listOfStrings = listOf("apple", "banana", "apple", "orange", "grape")
  val distinctStringList = listOfStrings.distinct()

  println(distinctStringList)
}

Для прикладу, нам треба отримати список виробників зі списку товарів. Використовуємо distinctBy{ it.producer } і отримаємо лише унікальних виробників.

/5 reduce - перетворення колекції в єдиний результат

fun main(args: Array<String>) {
  val listOfPrices = listOf(100, 200, 300)
  val totalPrice = listOfPrices.reduce { acc, price -> acc + price }

  println(totalPrice)
}

Нам потрібно порахувати загальну суму, яку повиннен заплатити покупець. Беремо список всіх його товарів, використовуємо reduce і отримаємо загальну суму.

⚠️ Список не може бути пустий, бо буде креш, тому використовуємо reduceOrNull, якщо не впевнені, що наш список містить елементи.

/6 all і any- чи всі елементи задовольняють певну умову та чи хоч один задовільняє умову

fun main(args: Array<String>) {
  val listOfNumbers = listOf(1, 2, 3, 4, 5)
  val allEven = listOfNumbers.all { it % 2 == 0 }

  println(allEven)
}

Треба перевірити чи всі студенти здали домашнє завдання. Використовуємо all і бачимо результат. Якщо нам треба знати чи хоч один студент здав використовуємо - any.

/7 elementAt, elementAtOrElse та elementAtOrNull - отримати елемент за індексом

val list = listOf(1, 2, 3)
println(list.elementAtOrNull(0)) // 1
println(list.elementAtOrNull(2)) // 3
println(list.elementAtOrNull(3)) // null

val emptyList = emptyList<Int>()
println(emptyList.elementAtOrNull(0)) // null

Якщо нам треба отримати елемент за індексом.

⚠️ Памʼятаємо, що якщо ми використовуємо elementAt, а такого елемента немає, то буде креш. Тому використовуємо elementAtOrNull чи elementAtOrElse та придумуємо, що робити у випадку null.

Evil Kermit Meme Generator - Piñata Farms - The best meme generator and  meme maker for video & image memes

Ну якось так. Пишіть про функції колекцій які ви використовуєте найчастіще 😉

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Roman K
Roman K@rmnkhr

530Прочитань
2Автори
12Читачі
На Друкарні з 15 квітня

Більше від автора

  • Як перемагати на хакатонах

    Розкажу про хакатони, у яких я брав участь з 2015 року. Ідеї, презентації, перемоги, висновки, смішні ситуації та меми

    Теми цього довгочиту:

    Hackathon
  • Як працює ChatGPT простими словами

    Спробуємо розібратися як працють нейронки та в чому унікальність ChatGPT

    Теми цього довгочиту:

    Chat Gpt

Вам також сподобається

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається