inline-funksjoner: Fjerne lambda-overhead
Merk funksjoner som inline for å unngå objektoppretting for lambda-parametere.
inline-funksjoner: Fjerne lambda-overhead er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hva er en inline-funksjon?
Vanligvis kompileres en lambda som sendes til en funksjon, til en anonym klasse. Hvert kall oppretter et nytt objekt, noe som koster minne og tid. Nøkkelordet inline forteller kompilatoren at den skal kopiere funksjonskroppen (og lambda-argumentene) direkte inn på kallstedet.
Deklarere inline
Legg til modifikatoren inline foran fun:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}Slik skriver kompilatoren om kallet
Et kall som measureTime { doWork() } blir på bytekodenivå til funksjonskroppen i measureTime, limt inn direkte – det opprettes aldri noe lambda-objekt.
Når bør De bruke inline?
Bruk inline når:
- Funksjonen tar én eller flere lambda-parametere
- Den kalles ofte i ytelseskritiske kodebaner (tette løkker, composable-funksjoner)
- De trenger
reified-typeparametere (omtales i neste del)
Eksempel på ytelsesmåling
Uten inline oppretter hvert kall til en høyereordensfunksjon et lambda-objekt. Med inline ser JVM-en lineær kode – ingen objektallokering og ingen virtuell dispatch.
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}Ikke-lokale returer
En viktig fordel med inline-funksjoner er at lambda-en kan bruke return til å avslutte den omsluttende funksjonen, ikke bare lambda-en. Dette kalles en ikke-lokal retur.
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
}Begrensninger ved inline
Inline-funksjoner kan ikke lagres i variabler eller sendes som objekter fordi de ikke finnes som førsteklasses enheter under kjøring. De kan ikke kalle f(::measureTime) når f forventer en funksjonsreferanse med denne signaturen.
Inlining av samlingsrør
Standardbibliotekfunksjonene map, filter, forEach og så videre er alle inline. Derfor oppretter kjeding av dem ikke ekstra closure-objekter for hvert element.
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)Avveininger for kodestørrelse
Hvert kallsted får en kopi av den inlinete koden. Hvis funksjonskroppen er stor og kalles fra mange steder, øker bytekodestørrelsen. Foretrekk inline for små lambda-er som kalles ofte.
Samspill med companion og toppnivå
inline fungerer på funksjoner på toppnivå og medlemsfunksjoner. Det fungerer ikke på egenskaper eller konstruktører. Funksjonen må være synlig på kallstedet, vanligvis public eller internal.
Eksempler fra standardbiblioteket
Funksjoner De allerede kjenner, som er inline: let, run, apply, also, with, use, synchronized og lazy (variant med blokk). Det er modifikatoren inline som gjør lambda-ene deres kostnadsfrie.
Hurtigsjekk
Hva er den viktigste fordelen ved å merke en høyereordensfunksjon med inline?
Oppsummering: inline-funksjoner
Viktigste punkter:
inlineeliminerer opprettelsen av lambda-objekter- Gjør ikke-lokale returer fra lambda-er mulig
- Er nødvendig for
reified-typeparametere - Passer best for små høyereordensfunksjoner som kalles ofte
- Omfangsfunksjonene i standardbiblioteket er alle
inline
Lær deg Kotlin med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «inline-funksjoner: Fjerne lambda-overhead» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «inline-funksjoner: Fjerne lambda-overhead», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «inline-funksjoner: Fjerne lambda-overhead»?
Merk funksjoner som inline for å unngå objektoppretting for lambda-parametere. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Kotlin Academy?
Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «inline-funksjoner: Fjerne lambda-overhead»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?
Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- inline-funksjoner: Fjerne lambda-overhead
- noinline- og crossinline-modifikatorer
- reified-typeparametere: Få tilgang til T under kjøring
- Praktiske reified-mønstre: Parsing, DI og serialisering