Kotlin: run, let, apply, also, with — wann was verwenden? Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kotlin: run, let, apply, also, with — wann was verwenden? Vollständige Analyse mit Beispielen



Hallo, Freund! Wenn du Kotlin lernst und sauberen, prägnanten Code schreiben möchtest, wirst du früher oder später auf fünf magische Funktionen stoßen: run, let, apply, also und with. Dies sind Scope Functions (Funktionen des Gültigkeitsbereichs) — sie ermöglichen es, Code im Kontext eines Objekts auszuführen und erleichtern das Leben enorm.



Aber hier ist der Haken: Viele Anfänger (und nicht nur sie) sind verwirrt, wann sie was anwenden sollen. Diese Frage ist eine der beliebtesten auf Stack Overflow, und heute werden wir ein für alle Mal klären, wie man keine Fehler macht. Wir werden nicht nur die Regeln auflisten — wir zeigen praktische Beispiele aus der Praxis, die du sofort in deinen Projekten verwenden kannst.



Was sind Scope Functions und wozu braucht man sie?

Scope Functions sind Funktionen, die einen temporären Gültigkeitsbereich für ein Objekt erstellen. Innerhalb dieses Bereichs kannst du über it oder this auf das Objekt zugreifen. Der Hauptunterschied zwischen ihnen ist, wie sie das Ergebnis zurückgeben und wie sie auf den Kontext verweisen.



Hier ist ein kurzer Spickzettel, den wir mit Beispielen füllen werden:

  • let — Kontext: it, Rückgabe: Ergebnis des Lambda. Wird für Null-Prüfungen und Aufrufketten verwendet.
  • run — Kontext: this, Rückgabe: Ergebnis des Lambda. Universelle Funktion, oft für Initialisierung und Berechnungen.
  • apply — Kontext: this, Rückgabe: das Objekt selbst. Ideal zum Konfigurieren von Objekteigenschaften.
  • also — Kontext: it, Rückgabe: das Objekt selbst. Gut für zusätzliche Aktionen (Logging, Prüfungen).
  • with — Keine Extension-Funktion, Kontext: this, Rückgabe: Ergebnis des Lambda. Praktisch zum Gruppieren von Aufrufen eines Objekts, ohne ein neues zu erstellen.


Merke dir die Hauptregel: Die Wahl der Funktion hängt davon ab, was du brauchst — das Objekt oder das Ergebnis zurückzugeben, und wie du auf den Kontext zugreifen möchtest (über it oder this).



1. let — der König der sicheren Ketten

let ist dein bester Freund, wenn du mit nullable-Objekten arbeiten musst. Es führt den Code nur aus, wenn das Objekt nicht null ist. Der Kontext wird als it übergeben.



Beispiel: Sichere Umwandlung

val name: String? = "Andreas"// Ohne let:if (name != null) {    println("Länge des Namens: ${name.length}")}

// Mit let (viel eleganter):name?.let { println("Länge des Namens: ${it.length}")}


let eignet sich auch hervorragend für Operationsketten. Zum Beispiel, wenn du ein Objekt in ein anderes umwandeln musst:



val numbers = listOf(1, 2, null, 4, null, 6)val nonNullSquared = numbers    .mapNotNull { it }    .let { list ->        list.map { it * it }    }println(nonNullSquared) // [1, 4, 16, 36]


Wann let verwenden:

  • Null-Prüfung (der häufigste Fall).
  • Umwandlung eines Werts in einen anderen.
  • Ausführen einer Operationskette mit dem Ergebnis.


2. apply — der Konstruktor ohne überflüssige Worte

apply gibt das Objekt selbst zurück, und innerhalb des Lambda ist der Kontext this. Dies ist das ideale Werkzeug zum Konfigurieren eines Objekts vor der Verwendung. Vergiss lange set-Blöcke!



Beispiel: Konfiguration von View (Android) oder data class

data class User(var name: String = "", var age: Int = 0)

val user = User().apply { name = "Maria" age = 25}println(user) // User(name=Maria, age=25)

// Noch besser — Konfiguration von TextView:val textView = TextView(context).apply { text = "Hallo, Kotlin!" textSize = 18f setTextCo

Blogs

Buchempfehlungen