Kotlin let, run, also, apply, with

In diesem Tutorial werden wir einige der wichtigen Standardbibliotheksfunktionen implementieren, die in Kotlin verfügbar sind. Die kotlin-stdlib bietet uns nützliche Höhere-Ordnungs-Funktionen, die idiomatische Muster implementieren. Wir werden sehen, wie sie das Programmieren in Kotlin so einfacher und schneller machen. Die unten diskutierten Funktionen sind:

  • let
  • run
  • also
  • apply
  • with

Kotlin let

let nimmt das Objekt, auf das es aufgerufen wird, als Parameter und gibt das Ergebnis des Lambda-Ausdrucks zurück. Kotlin let ist eine Umgebungsfunktion, bei der die innerhalb des Ausdrucks deklarierten Variablen außerhalb nicht verwendet werden können. Ein Beispiel, das die Funktion kotlin let demonstriert, ist unten angegeben.

fun main(args: Array) {
    var str = "Hello World"
    str.let { println("$it!!") }
    println(str)

}
//Prints
//Hallo Welt!!
//Hallo Welt

it-Schlüsselwort enthält die Kopie der Eigenschaft innerhalb von let. Der letzte Wert aus dem let wird als Argument zurückgegeben, wie unten gezeigt.

var strLength = str.let { "$it function".length }
println("strLength is $strLength") //prints strLength is 25

Verschachtelung von let-Funktionen

var a = 1
var b= 2

a = a.let { it + 2 }.let { val i = it + b
        i}
println(a) //5

Wie Sie sehen können, haben wir eine lokale Variable „i“ innerhalb der zweiten let-Funktion deklariert. Wenn wir die letzte Anweisung der let-Funktion auf i setzen, wird die Eigenschaft an die äußere Eigenschaft a zurückgegeben.

Verschachtelung von let

Wir können einen let-Ausdruck innerhalb eines anderen let-Ausdrucks wie unten gezeigt festlegen.

var x = "Anupam"
x.let { outer -> outer.let { inner -> print("Inner is $inner and outer is $outer") } }

//Prints
//Inneres ist Anupam und äußeres ist Anupam

Für verschachteltes let können wir das Schlüsselwort it nicht verwenden. Wir müssen explizite Namen für it in beiden let-Funktionen zuweisen. Nur das äußerste let gibt den Wert wie unten gezeigt zurück.

var x = "Anupam"
    x = x.let { outer ->
        outer.let { inner ->
            println("Inner is $inner and outer is $outer")
            "Kotlin Tutorials Inner let"
        }
        "Kotlin Tutorials Outer let" 
    }
    println(x) //prints Kotlin Tutorials Outer let

let für Nullprüfungen

Zusätzlich ist let nützlich zum Überprüfen von Nullable-Eigenschaften wie unten gezeigt.

var name : String? = "Kotlin let null check"
name?.let { println(it) } //prints Kotlin let null check
name = null
name?.let { println(it) } //nothing happens

Der Code innerhalb des let-Ausdrucks wird nur ausgeführt, wenn die Eigenschaft nicht null ist. Somit erspart uns let auch den if else Null-Checker!

Kotlin ausführen

Kotlin run ist eine weitere interessante Funktion. Das folgende Beispiel zeigt ihre Anwendungsfälle.

var tutorial = "This is Kotlin Tutorial"
    println(tutorial) //This is Kotlin Tutorial
    tutorial = run {
        val tutorial = "This is run function"
        tutorial
    }
    println(tutorial) //This is run function

Die Kotlin-run-Expression kann die äußere Eigenschaft ändern. Daher haben wir sie im obigen Code für den lokalen Bereich neu definiert.

  • Ähnlich wie die Funktion let gibt die Funktion run auch die letzte Anweisung zurück.
  • Im Gegensatz zu let unterstützt die Funktion run jedoch nicht das Schlüsselwort it.

let und run

Lassen Sie uns die Funktionen let und run zusammenführen.

var p : String? = null
    p?.let { println("p is $p") } ?: run { println("p was null. Setting default value to: ")
        p = "Kotlin"}

    println(p)
//Prints
//p war null. Standardwert setzen auf: 
//Kotlin

Kotlin auch

Wie der Name schon sagt, führt die also-Expression eine zusätzliche Verarbeitung des aufgerufenen Objekts durch. Im Gegensatz zu let gibt es jedoch das Originalobjekt zurück, anstatt neue Rückgabedaten zu erzeugen. Daher hat das Rückgabedaten immer den gleichen Typ. Ähnlich wie let verwendet auch also it.

var m = 1
m = m.also { it + 1 }.also { it + 1 }
println(m) //prints 1 

Kotlin let vs also

Der folgende Codeausschnitt zeigt ein großartiges Beispiel, um zwischen let und also zu unterscheiden.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

var l = person.let { it.tutorial = "Android" }
var al = person.also { it.tutorial = "Android" }
    
println(l)
println(al)
println(person)

Im obigen Code haben wir Datenträgerklassen verwendet. Der also-Ausdruck gibt das Datenklassenobjekt zurück, während der let-Ausdruck nichts (Unit) zurückgibt, da wir nichts explizit angegeben haben.

Kotlin apply

Kotlin apply ist eine Erweiterungsfunktion für einen Typ. Es wird auf die Objektreferenz (auch als Empfänger bezeichnet) im Ausdruck angewendet und gibt die Objektreferenz bei Abschluss zurück.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

person.apply { this.tutorial = "Swift" }
println(person)

apply vs also

data class Person(var n: String, var t : String)
var person = Person("Anupam", "Kotlin")

person.apply { t = "Swift" }
println(person)

person.also { it.t = "Kotlin" }
println(person)

Hinweis: In apply ist it nicht erlaubt. Wenn der Eigenschaftsname der Datenträgerklasse in der Funktion eindeutig ist, können Sie this weglassen. Wir sollten also nur verwenden, wenn wir this nicht verdecken möchten.

Kotlin mit

Wie apply wird with verwendet, um Instanzeigenschaften zu ändern, ohne jedes Mal den Punktoperator über den Verweis aufrufen zu müssen.

data class Person(var name: String, var tutorial : String)
var person = Person("Anupam", "Kotlin")

with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
    }

Noch einmal, with ist ähnlich wie apply, bis auf einige Unterschiede.

Kotlin apply vs with

  • with wird ohne ein Objekt (Empfänger) ausgeführt, während apply eines benötigt.
  • apply wird auf der Objektreferenz ausgeführt, während with sie nur als Argument übergibt.
  • Der letzte Ausdruck der with-Funktion gibt ein Ergebnis zurück.
var xyz = with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
        val xyz = "End of tutorial"
        xyz
    }
    println(xyz) //End of tutorial

Das ist alles für die Kotlin-Standardfunktionen zum Ändern von Variablen oder Modifizieren von Objekten innerhalb der Funktion.

Source:
https://www.digitalocean.com/community/tutorials/kotlin-let-run-also-apply-with