Sobes.tech
Junior

Come lavorare con le collezioni in Kotlin?

sobes.tech AI

Risposta dell'AI

In Kotlin, le collezioni rappresentano gruppi di oggetti. Possono essere modificabili (mutable) o immutabili (immutable).

Collezioni immutabili (Immutable):

  • Il contenuto non può essere modificato dopo la creazione.
  • Sono sicure per la lettura in ambienti concorrenti.
  • Tipi di base: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Creazione di una lista immutabile
// numbers.add(4) // Errore di compilazione: collezione immutabile

Collezioni modificabili (Mutable):

  • Il contenuto può essere modificato (aggiunta, rimozione, modifica degli elementi).
  • Non sono sicure per l’accesso concorrente di default (richiede sincronizzazione manuale).
  • Tipi di base: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Creazione di una lista modificabile
mutableNumbers.add(4) // Aggiunta di un elemento
mutableNumbers.remove(2) // Rimozione di un elemento

Tipi principali di collezioni:

  • List: Collezione ordinata che permette duplicati. Accesso tramite indice.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Collezione non ordinata che non permette duplicati. Gli elementi sono unici.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Collezione di coppie chiave-valore. Ogni chiave è unica.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Funzioni di estensione per lavorare con le collezioni (funzioni di ordine superiore):

Kotlin fornisce molte funzioni di estensione potenti per manipolare le collezioni:

  • filter: Crea una nuova collezione contenente solo gli elementi che soddisfano un predicato.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Trasforma ogni elemento in un nuovo elemento, creando una nuova collezione.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Esegue un’azione per ogni elemento.
    numbers.forEach { println(it) } // Stampa 1, 2, 3 riga per riga
    
  • reduce: Combina tutti gli elementi in un singolo valore usando un’operazione.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Simile a reduce, ma accetta un valore iniziale.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Ordina la collezione in base a un valore estratto da ogni elemento.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Raggruppa gli elementi in base a una chiave estratta da ogni elemento.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Conversione tra tipi di collezioni:

È facile convertire un tipo di collezione in un altro, così come tra versioni modificabili e immutabili:

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

Lavorare con le collezioni in Kotlin è notevolmente semplificato grazie alla ricchezza della libreria standard e alle funzioni di estensione.