Kotlin Academy · Lezione

Sequence e collezioni a confronto

Scopra quando conviene ciascuna

Lezione 4 di 413 passaggi

Sequence e collezioni a confronto è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Sequenze e collezioni

Sia le sequenze sia le collezioni offrono le stesse operazioni funzionali, ma le valutano in modo diverso. Sapere quando conviene usare ciascuna delle due soluzioni aiuta a scrivere codice efficiente e leggibile.

Riepilogo delle collezioni eager

Le collezioni sono eager: ogni operazione elabora tutti gli elementi e produce immediatamente una nuova collezione. Per dati di piccole dimensioni, questo approccio è semplice e veloce.

fun main() {
    val result = listOf(1, 2, 3).map { it + 1 }.filter { it > 2 }
    println(result)
}

Riepilogo delle sequenze lazy

Le sequenze sono lazy: le operazioni costruiscono una pipeline che viene eseguita elemento per elemento solo quando viene consumata, evitando le collezioni intermedie.

fun main() {
    val result = listOf(1, 2, 3).asSequence().map { it + 1 }.filter { it > 2 }.toList()
    println(result)
}

Quando convengono le collezioni

Per collezioni di piccole dimensioni e catene brevi, le collezioni sono generalmente più veloci e più chiare. Le sequenze aggiungono un costo per ogni elemento, dovuto alle chiamate dell'iteratore, che può superare i vantaggi su dati molto piccoli.

Quando convengono le sequenze

Le sequenze sono vantaggiose quando i dati sono numerosi, la catena è lunga o serve solo una parte del risultato, ad esempio la prima corrispondenza o i primi N elementi. Evitano di creare grandi liste intermedie e si interrompono in anticipo.

fun main() {
    val firstEvenSquare = (1..1000000).asSequence()
        .map { it * it }
        .first { it % 2 == 0 }
    println(firstEvenSquare)
}

Misurare la differenza

Questo esempio con un intervallo ampio mostra come una sequenza eviti di produrre una lista intermedia di un milione di elementi, che invece la versione eager creerebbe.

fun main() {
    val seqResult = (1..1000).asSequence()
        .filter { it % 2 == 0 }
        .map { it * 3 }
        .take(3)
        .toList()
    println(seqResult)
}

Impatto sulla memoria

Le catene eager mantengono contemporaneamente in memoria ogni lista intermedia. Le sequenze mantengono in transito solo l'elemento corrente, quindi la memoria massima utilizzata rimane ridotta anche nelle pipeline lunghe.

Vantaggio dell'interruzione anticipata

Se un'operazione terminale può terminare in anticipo, come first, find o any, le sequenze saltano gli elementi rimanenti, mentre le collezioni eager li avrebbero già elaborati tutti.

fun main() {
    val found = (1..100).asSequence()
        .map { println("checking $it"); it }
        .any { it == 3 }
    println("Found: $found")
}

Attenzione alle operazioni con stato

Operazioni come sorted, distinct e groupBy hanno bisogno di tutti gli elementi, quindi riducono i vantaggi della valutazione lazy. Una pipeline dominata da queste operazioni potrebbe non trarre beneficio dall'uso di una sequenza.

Una linea guida pratica

Regola generale: per impostazione predefinita, scelga le collezioni per mantenere il codice chiaro. Passi a una sequenza quando elabora molti dati, concatena numerose operazioni o ha bisogno solo di una piccola parte del risultato. Se le prestazioni sono critiche, esegua sempre delle misurazioni.

Stessa API, motore diverso

Poiché condividono gli stessi nomi delle operazioni, di solito è possibile passare da una soluzione all'altra aggiungendo o rimuovendo asSequence() e un'operazione terminale toList(). In questo modo sperimentare con le prestazioni comporta pochi rischi.

fun main() {
    val data = listOf(1, 2, 3, 4, 5)
    val asList = data.map { it * 2 }.filter { it > 4 }
    val asSeq = data.asSequence().map { it * 2 }.filter { it > 4 }.toList()
    println(asList == asSeq)
}

Verifica rapida

In quale situazione è più probabile che una sequenza sia più veloce di una collezione?

Riepilogo

Le collezioni sono eager e sono ideali per dati di piccole dimensioni e per mantenere il codice chiaro; le sequenze sono lazy e sono ideali per grandi quantità di dati, catene lunghe o risultati parziali, grazie all'assenza di liste intermedie e all'interruzione anticipata. Presti attenzione alle operazioni con stato. Condividono la stessa API, quindi passare dall'una all'altra è semplice. Questo conclude il corso sulle sequenze.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Sequence e collezioni a confronto» è gratuita?

Sì — il testo completo di «Sequence e collezioni a confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Sequence e collezioni a confronto»?

Scopra quando conviene ciascuna Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Sequence e collezioni a confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché utilizzare le sequence
  2. Creazione di sequence
  3. Operazioni lazy
  4. Sequence e collezioni a confronto
← Torna a Kotlin Academy