Sobes.tech
Junior

Jak pracować z kolekcjami w Kotlin?

sobes.tech AI

Odpowiedź od AI

W Kotlinie kolekcje reprezentują grupy obiektów. Mogą być modyfikowalne (mutable) lub niemodyfikowalne (immutable).

Niemodyfikowalne kolekcje (Immutable):

  • Zawartość nie może być zmieniona po utworzeniu.
  • Są bezpieczne do odczytu w środowiskach wielowątkowych.
  • Podstawowe typy: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Tworzenie niemodyfikowalnej listy
// numbers.add(4) // Błąd kompilacji: niemodyfikowalna kolekcja

Modyfikowalne kolekcje (Mutable):

  • Zawartość może być zmieniana (dodawanie, usuwanie, modyfikacja elementów).
  • Domyślnie nie są bezpieczne dla wielowątkowości (wymagana ręczna synchronizacja).
  • Podstawowe typy: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Tworzenie listy modyfikowalnej
mutableNumbers.add(4) // Dodanie elementu
mutableNumbers.remove(2) // Usunięcie elementu

Główne typy kolekcji:

  • List: Kolekcja uporządkowana, pozwala na duplikaty. Dostęp przez indeks.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Kolekcja nieuporządkowana, nie pozwala na duplikaty. Elementy są unikalne.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Kolekcja par klucz-wartość. Każdy klucz jest unikalny.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Funkcje rozszerzające do pracy z kolekcjami (funkcje wyższego rzędu):

Kotlin oferuje wiele potężnych funkcji rozszerzających do obsługi kolekcji:

  • filter: Tworzy nową kolekcję zawierającą tylko elementy spełniające warunek.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Przekształca każdy element w nowy element, tworząc nową kolekcję.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Wykonuje akcję dla każdego elementu.
    numbers.forEach { println(it) } // Wypisze 1, 2, 3 linia po linii
    
  • reduce: Łączy wszystkie elementy w jedną wartość za pomocą operacji.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Podobne do reduce, ale z wartością początkową.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Sortuje kolekcję według wartości wyodrębnionej z każdego elementu.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Grupuje elementy według klucza wyodrębnionego z każdego elementu.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Konwersja między typami kolekcji:

Można łatwo konwertować jeden typ kolekcji na inny, a także między wersjami modyfikowalnymi i niemodyfikowalnymi:

val mutableList: MutableList<Int> = listOf(1, 2, 3).toMutableList()
val immutableList: List<Int> = mutableListOf(4, 5, 6).toList()

Praca z kolekcjami w Kotlinie jest znacznie uproszczona dzięki bogactwu biblioteki standardowej i funkcjom rozszerzającym.