Kotlin let, run, also, apply, with

In deze tutorial zullen we enkele van de belangrijke standaardbibliotheekfuncties implementeren die beschikbaar zijn in Kotlin. De kotlin-stdlib biedt ons nuttige functies van hogere orde die idiomatische patronen implementeren. We zullen zien hoe ze programmeren in Kotlin zo veel gemakkelijker en sneller maken. De functies die we hieronder gaan bespreken zijn:

  • let
  • run
  • also
  • apply
  • with

Kotlin let

let neemt het object waarop het wordt aangeroepen als parameter en retourneert het resultaat van de lambda-expressie. Kotlin let is een scopingsfunctie waarbij de variabelen die binnen de expressie zijn gedeclareerd niet buiten kunnen worden gebruikt. Een voorbeeld dat de kotlin let-functie demonstreert, wordt hieronder gegeven.

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

}
//Prints
//Hallo wereld!!
//Hallo wereld

it sleutelwoord bevat de kopie van de eigenschap binnen let. De laatste waarde van de let wordt geretourneerd als argument zoals hieronder getoond.

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

Keten van let-functies

var a = 1
var b= 2

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

Zoals je kunt zien hebben we een lokale variabele “i” gedeclareerd binnen de tweede let-functie. Door de laatste instructie van de let-functie in te stellen op i, wordt de eigenschap teruggegeven aan de buitenste eigenschap a.

Nesting let

We kunnen een let-expressie binnen een andere let-expressie instellen zoals hieronder getoond.

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

//Prints
//Inner is Anupam and outer is Anupam

Voor geneste let kunnen we het it-sleutelwoord niet gebruiken. We moeten expliciete namen toewijzen aan it in beide let-functies. Alleen de buitenste let retourneert de waarde zoals hieronder getoond.

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 voor null-controles

Bovendien is let handig voor het controleren van Nullable eigenschappen zoals hieronder getoond.

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

De code binnen de let-expressie wordt alleen uitgevoerd wanneer de eigenschap niet null is. Zo bespaart let ons ook van de if else null-checker!

Kotlin run

Kotlin run is een andere interessante functie. Het volgende voorbeeld toont de gebruiksscenario’s ervan.

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

Met de Kotlin run expressie kan de buitenste eigenschap worden gewijzigd. Daarom hebben we het in de bovenstaande code opnieuw gedefinieerd voor de lokale scope.

  • Net als de let-functie retourneert de run-functie ook de laatste instructie.
  • In tegenstelling tot let ondersteunt de run-functie het it-sleutelwoord niet.

let en run

Laten we de let- en run-functies samen combineren.

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 was null. Standaardwaarde instellen op: 
//Kotlin

Kotlin ook

Zoals de naam al zegt, voert de also-expressie aanvullende verwerking uit op het object waarop het is aangeroepen. In tegenstelling tot let retourneert het het oorspronkelijke object in plaats van nieuwe retourgegevens. Daarom heeft de retourgegevens altijd hetzelfde type. Net als let gebruikt also ook it.

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

Kotlin let vs also

Het volgende codefragment toont een geweldig voorbeeld om het verschil tussen let en also te differentiëren.

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)

In de bovenstaande code hebben we Gegevensklassen gebruikt. De also expressie retourneert het object van de gegevensklasse terwijl de let expressie niets retourneert (Unit) omdat we niets expliciet hebben gespecificeerd.

Kotlin apply

Kotlin apply is een extensiefunctie op een type. Het wordt uitgevoerd op de objectreferentie (ook wel ontvanger genoemd) in de expressie en retourneert de objectreferentie bij voltooiing.

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)

Opmerking: In apply is it niet toegestaan. Als de eigenschapsnaam van de gegevensklasse uniek is in de functie, kunt u this weglaten. We moeten also alleen gebruiken als we this niet willen overschaduwen.

Kotlin met

Net als apply, wordt with gebruikt om de eigenschappen van een instantie te wijzigen zonder telkens de puntoperator over de verwijzing te hoeven aanroepen.

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

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

Opnieuw is with vergelijkbaar met apply behalve voor een paar verschillen.

Kotlin apply vs with

  • De laatste expressie van de with-functie retourneert een resultaat.
var xyz = with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
        val xyz = "End of tutorial"
        xyz
    }
    println(xyz) //End of tutorial

Dat is alles voor standaard Kotlin-functies om variabelen te wijzigen of objecten binnen de functie te wijzigen.

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