inline-funktioner: Fjernelse af lambda-overhead
Markér funktioner som inline for at undgå oprettelse af objekter til lambda-parametre.
inline-funktioner: Fjernelse af lambda-overhead er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.
Hvad er en inline-funktion?
Normalt kompileres en lambda, der sendes til en funktion, til en anonym klasse. Hvert kald allokerer et nyt objekt, hvilket koster hukommelse og tid. Nøgleordet inline fortæller compileren, at den skal kopiere funktionens krop (og dens lambda-argumenter) direkte ind på kaldestedet.
Deklaration af inline
Tilføj modifikatoren inline før fun:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}Sådan omskriver compileren kaldet
Et kald som measureTime { doWork() } bliver på bytecode-niveau til, at kroppen i measureTime indsættes inline — der allokeres aldrig et lambda-objekt.
Hvornår skal du bruge inline?
Brug inline, når:
- Funktionen tager en eller flere lambda-parametre
- Den kaldes ofte i ydeevnekritiske stier (tætte løkker, composable-funktioner)
- Du har brug for
reified-typeparametre (som gennemgås næste gang)
Eksempel på ydeevnemåling
Uden inline allokerer hvert kald til en højereordensfunktion et lambda-objekt. Med inline ser JVM'en sekventiel kode — ingen allokering og ingen virtuel metodeopslag.
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}Ikke-lokale returneringer
En vigtig fordel ved inline-funktioner er, at lambdaen kan bruge return til at forlade den omsluttende funktion i stedet for kun lambdaen. Det kaldes en ikke-lokal returnering.
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
}Begrænsninger ved inline
Inline-funktioner kan ikke gemmes i variabler eller sendes som objekter, fordi de ikke findes som førsteklasses entiteter under kørsel. Du kan ikke kalde f(::measureTime), hvis f forventer en funktionsreference med den signatur.
Inlining af samlingskæder
Standardbibliotekets funktioner map, filter, forEach osv. er alle inline. Derfor opretter kædning af dem ikke ekstra lukningsobjekter for hvert element.
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)Afvejning af kodestørrelse
Hvert kaldested modtager en kopi af den inlinede kode. Hvis funktionskroppen er stor og kaldes fra mange steder, vokser bytecodens størrelse. Foretræk inline til små lambdaer, der kaldes ofte.
Samspil med companion- og topniveau-funktioner
inline fungerer på funktioner på øverste niveau og medlemsfunktioner. Det fungerer ikke på egenskaber eller konstruktører. Funktionen skal være synlig på kaldestedet (normalt public eller internal).
Eksempler fra standardbiblioteket
Funktioner, du allerede kender, som er inline: let, run, apply, also, with, use, synchronized og lazy (blokvarianten). Det er modifikatoren inline, der gør deres lambdaer omkostningsfri.
Hurtigt tjek
Hvad er den vigtigste fordel ved at markere en højereordensfunktion som inline?
Opsummering: inline-funktioner
Vigtigste pointer:
inlinefjerner allokering af lambda-objekter- Gør ikke-lokale returneringer fra lambdaer mulige
- Er påkrævet for
reified-typeparametre - Er bedst til små højereordensfunktioner, der kaldes ofte
- Standardbibliotekets kontekstfunktioner er alle
inline
Lær Kotlin med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “inline-funktioner: Fjernelse af lambda-overhead” gratis?
Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “inline-funktioner: Fjernelse af lambda-overhead”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “inline-funktioner: Fjernelse af lambda-overhead”?
Markér funktioner som inline for at undgå oprettelse af objekter til lambda-parametre. Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Kotlin Academy?
Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “inline-funktioner: Fjernelse af lambda-overhead”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?
Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- inline-funktioner: Fjernelse af lambda-overhead
- noinline- og crossinline-modifikatorer
- reified-typeparametre: Adgang til T under kørsel
- Praktiske reified-mønstre: Parsing, DI og serialisering