0Pricing
Kotlin Academy · Lezione

Funzioni inline: eliminare l'overhead delle lambda

Contrassegni le funzioni come inline per evitare la creazione di oggetti per i parametri lambda.

Funzioni inline: eliminare l'overhead delle lambda è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Che cos'è una funzione inline?

Normalmente, una lambda passata a una funzione viene compilata in una classe anonima. Ogni invocazione alloca un nuovo oggetto, con un costo in termini di memoria e tempo. La parola chiave inline indica al compilatore di copiare il corpo della funzione e i relativi argomenti lambda direttamente nel punto della chiamata.

Dichiarare una funzione inline

Aggiunga il modificatore inline prima di fun:

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

Come il compilatore riscrive la chiamata

Una chiamata come measureTime { doWork() } diventa, a livello di bytecode, il corpo di measureTime inserito direttamente nella chiamata: non viene mai allocato alcun oggetto lambda.

Quando utilizzare inline

Utilizzi inline quando:

  • la funzione accetta uno o più parametri lambda
  • viene chiamata frequentemente in percorsi critici (cicli stretti, composable)
  • sono necessari parametri di tipo reified (argomento trattato nella prossima sezione)

Esempio di benchmark delle prestazioni

Senza inline, ogni chiamata a una funzione di ordine superiore alloca un oggetto lambda. Con inline, la JVM vede codice lineare: nessuna allocazione e nessun dispatch virtuale.

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

Ritorni non locali

Un vantaggio fondamentale delle funzioni inline è che la lambda può utilizzare return per uscire dalla funzione circostante, non solo dalla lambda. Questo viene chiamato ritorno non locale.

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

Limitazioni di inline

Le funzioni inline non possono essere memorizzate in variabili o passate come oggetti, perché non esistono come entità di prima classe a runtime. Non è possibile chiamare f(::measureTime) quando f si aspetta un riferimento a una funzione con quella firma.

Pipeline di collezioni con inline

Le funzioni della libreria standard map, filter, forEach e così via sono tutte inline. Per questo concatenarle non crea oggetti closure aggiuntivi per ogni elemento.

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

Compromesso sulle dimensioni del codice

Ogni punto della chiamata riceve una copia del codice sottoposto a inlining. Se il corpo della funzione è grande e viene chiamato da molti punti, la dimensione del bytecode aumenta. Preferisca inline per lambda piccole chiamate frequentemente.

Interazione con companion e top-level

inline funziona sulle funzioni top-level e sulle funzioni membro. Non funziona su proprietà o costruttori. La funzione deve essere visibile nel punto della chiamata, in genere con visibilità public o internal.

Esempi dalla libreria standard

Funzioni inline che già conosce: let, run, apply, also, with, use, synchronized, lazy (variante con blocco). È il modificatore inline a rendere le relative lambda a costo zero.

Verifica rapida

Qual è il principale vantaggio di contrassegnare una funzione di ordine superiore come inline?

Riepilogo: funzioni inline

Punti chiave:

  • inline elimina l'allocazione degli oggetti lambda
  • consente i ritorni non locali dalle lambda
  • è necessario per i parametri di tipo reified
  • è ideale per funzioni di ordine superiore piccole e chiamate frequentemente
  • le funzioni di ambito della libreria standard sono tutte inline

Domande Frequenti

La lezione «Funzioni inline: eliminare l'overhead delle lambda» è gratuita?

Sì — il testo completo di «Funzioni inline: eliminare l'overhead delle lambda» è 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 «Funzioni inline: eliminare l'overhead delle lambda»?

Contrassegni le funzioni come inline per evitare la creazione di oggetti per i parametri lambda. 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 1 di 4.

Quanto tempo richiede la lezione «Funzioni inline: eliminare l'overhead delle lambda»?

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. Funzioni inline: eliminare l'overhead delle lambda
  2. Modificatori noinline e crossinline
  3. Parametri di tipo reified: accedere a T a runtime
  4. Pattern reified pratici: parsing, DI e serializzazione
← Torna a Kotlin Academy