Funzioni let, run, also, apply, with di Kotlin

In questo tutorial, implementeremo alcune delle importanti funzioni della libreria standard disponibili in Kotlin. La kotlin-stdlib ci fornisce utili funzioni di ordine superiore che implementano modelli idiomati. Vedremo come rendono la programmazione in Kotlin così più semplice e veloce. Le funzioni di cui parleremo di seguito sono:

  • let
  • run
  • also
  • apply
  • with

Kotlin let

let prende l’oggetto su cui viene invocato come parametro e restituisce il risultato dell’espressione lambda. Kotlin let è una funzione di contesto in cui le variabili dichiarate all’interno dell’espressione non possono essere utilizzate all’esterno. Un esempio che dimostra la funzione let di kotlin è mostrato di seguito.

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

}
//Prints
//Hello World!!
//Hello World

it contiene la copia della proprietà all’interno di let. L’ultimo valore di let viene restituito come argomento come mostrato di seguito.

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

Concatenazione di funzioni let

var a = 1
var b= 2

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

Come puoi vedere abbiamo dichiarato una variabile locale “i” all’interno della seconda funzione let. Impostando l’ultima istruzione della funzione let a i restituisce la proprietà alla proprietà esterna a.

Annidamento let

È possibile impostare un’espressione let all’interno di un’altra espressione let come mostrato di seguito.

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

//Prints
// Inner è Anupam e outer è Anupam

Per il let annidato, non possiamo utilizzare la parola chiave it. Dobbiamo assegnare nomi espliciti a it in entrambe le funzioni let. Solo il let più esterno restituisce il valore come mostrato di seguito.

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 per controlli null

Inoltre, let è utile per controllare le proprietà Nullable come mostrato di seguito.

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

Il codice all’interno dell’espressione let viene eseguito solo quando la proprietà non è nulla. Quindi let ci salva anche dal controllo null if else!

eseguire Kotlin

Kotlin run è un’altra funzione interessante. L’esempio seguente ne dimostra gli utilizzi.

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

L’espressione di esecuzione Kotlin può modificare la proprietà esterna. Pertanto, nel codice precedente, l’abbiamo ridefinita per lo scope locale.

  • Similmente alla funzione let, anche la funzione run restituisce l’ultimo statement.
  • A differenza di let, la funzione run non supporta la parola chiave it.

let e run

Uniamo insieme le funzioni let e run.

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 era nullo. Impostazione del valore predefinito su: 
//Kotlin

Kotlin anche

Come suggerisce il nome, le espressioni also effettuano un ulteriore processing sull’oggetto su cui sono state invocate. A differenza di let, restituiscono l’oggetto originale anziché nuovi dati di ritorno. Pertanto, i dati di ritorno hanno sempre lo stesso tipo. Come let, also utilizza anche it.

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

Kotlin let vs also

Il seguente frammento di codice mostra un ottimo esempio per differenziare tra let e also.

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)

Nel codice sopra, abbiamo utilizzato le classi di dati. L’espressione also restituisce l’oggetto della classe di dati mentre l’espressione let non restituisce nulla (Unit) poiché non abbiamo specificato nulla esplicitamente.

Kotlin apply

apply di Kotlin è una funzione di estensione su un tipo. Viene eseguita sull’oggetto di riferimento (anche noto come destinatario) nell’espressione e restituisce il riferimento all’oggetto al termine dell’esecuzione.

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)

Nota: In apply non è consentito it. Se il nome della proprietà della classe di dati è univoco nella funzione, è possibile omettere this. Dovremmo utilizzare also solo quando non vogliamo nascondere this.

Kotlin con

Come apply, with viene utilizzato per modificare le proprietà dell’istanza senza la necessità di chiamare l’operatore dot su ogni riferimento ogni volta.

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

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

Ancora una volta, with è simile a apply ad eccezione di alcune differenze.

Kotlin apply vs with

  • with viene eseguito senza un oggetto (destinatario), mentre apply ne ha bisogno.
  • apply viene eseguito sul riferimento dell’oggetto, mentre with lo passa semplicemente come argomento.
  • L’ultima espressione della funzione with restituisce un risultato.
var xyz = with(person)
    {
        name = "No Name"
        tutorial = "Kotlin tutorials"
        val xyz = "End of tutorial"
        xyz
    }
    println(xyz) //End of tutorial

E questo è tutto per le funzioni standard di Kotlin per modificare le variabili o modificare gli oggetti all’interno della funzione.

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