inline-Funktionen: Lambda-Overhead vermeiden
Markieren Sie Funktionen als inline, um die Objekterstellung für Lambda-Parameter zu vermeiden.
inline-Funktionen: Lambda-Overhead vermeiden ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist eine inline-Funktion?
Normalerweise wird eine an eine Funktion übergebene Lambda in eine anonyme Klasse kompiliert. Jeder Aufruf reserviert ein neues Objekt, was Speicher und Zeit kostet. Das Schlüsselwort inline weist den Compiler an, den Funktionskörper zu kopieren (ebenso wie seine Lambda-Argumente) und direkt an der Aufrufstelle einzufügen.
inline deklarieren
Fügen Sie den Modifizierer inline vor fun ein:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}Wie der Compiler den Aufruf umschreibt
Ein Aufruf wie measureTime { doWork() } wird auf Bytecode-Ebene zum inline eingefügten Körper von measureTime – es wird niemals ein Lambda-Objekt reserviert.
Wann Sie inline verwenden
Verwenden Sie inline, wenn:
- die Funktion einen oder mehrere Lambda-Parameter entgegennimmt
- sie häufig in Hot Paths aufgerufen wird (engen Schleifen, Composables)
- Sie
reified-Typparameter benötigen (wird als Nächstes behandelt)
Beispiel für einen Performance-Benchmark
Ohne inline reserviert jeder Aufruf einer Funktion höherer Ordnung ein Lambda-Objekt. Mit inline sieht die JVM geradlinigen Code – keine Allokation, kein virtueller Dispatch.
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}Nicht-lokale Rückgaben
Ein wesentlicher Vorteil von inline-Funktionen: Die Lambda kann return verwenden, um die umgebende Funktion zu verlassen, nicht nur die Lambda. Dies wird als nicht-lokale Rückgabe bezeichnet.
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
}Einschränkungen von inline
Inline-Funktionen können nicht in Variablen gespeichert oder als Objekte übergeben werden, da sie zur Laufzeit nicht als Entitäten erster Klasse existieren. Sie können f(::measureTime) nicht aufrufen, wenn f eine Funktionsreferenz mit dieser Signatur erwartet.
Collections-Pipelines inline ausführen
Die Standardbibliotheksfunktionen map, filter, forEach usw. sind alle inline. Deshalb erzeugt ihre Verkettung keine zusätzlichen Closure-Objekte pro Element.
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)Abwägung bei der Codegröße
Jede Aufrufstelle erhält eine Kopie des inline eingefügten Codes. Wenn der Funktionskörper groß ist und von vielen Stellen aufgerufen wird, wächst die Bytecode-Größe. Bevorzugen Sie inline für kleine, häufig aufgerufene Lambdas.
Zusammenspiel mit companion und Top-Level
inline funktioniert bei Top-Level-Funktionen und Member-Funktionen. Es funktioniert nicht bei Properties oder Konstruktoren. Die Funktion muss an der Aufrufstelle sichtbar sein (normalerweise public oder internal).
Beispiele aus der Standardbibliothek
Funktionen, die Sie bereits kennen und die inline sind: let, run, apply, also, with, use, synchronized, lazy (Blockvariante). Der Modifizierer inline sorgt dafür, dass ihre Lambdas ohne zusätzliche Kosten ausgeführt werden.
Kurzer Check
Was ist der wichtigste Vorteil davon, eine Funktion höherer Ordnung als inline zu markieren?
Zusammenfassung: inline-Funktionen
Die wichtigsten Punkte:
inlineverhindert die Reservierung von Lambda-Objekten- ermöglicht nicht-lokale Rückgaben aus Lambdas
- ist für
reified-Typparameter erforderlich - eignet sich am besten für kleine, häufig aufgerufene Funktionen höherer Ordnung
- die Scope-Funktionen der Standardbibliothek sind alle
inline
Häufig gestellte Fragen
Ist die Lektion „inline-Funktionen: Lambda-Overhead vermeiden“ kostenlos?
Ja — der vollständige Text von „inline-Funktionen: Lambda-Overhead vermeiden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „inline-Funktionen: Lambda-Overhead vermeiden“?
Markieren Sie Funktionen als inline, um die Objekterstellung für Lambda-Parameter zu vermeiden. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „inline-Funktionen: Lambda-Overhead vermeiden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- inline-Funktionen: Lambda-Overhead vermeiden
- noinline- und crossinline-Modifier
- Reifizierte Typparameter: Auf T zur Laufzeit zugreifen
- Praktische reified-Muster: Parsing, DI und Serialisierung