Sobes.tech
Junior

Qu'est-ce que les 'fonctions de portée' en Kotlin et quand faut-il les utiliser?

sobes.tech IA

Réponse de l'IA

Les fonctions de portée permettent d'exécuter un bloc de code dans le contexte d'un objet. Les fonctions principales sont : let, run, with, apply, also. Chacune a ses propres caractéristiques concernant le receveur (invocateur, receveur) et la valeur de retour.

Fonction Receveur Valeur de retour
let it Le résultat de la dernière expression dans le bloc
run this Le résultat de la dernière expression dans le bloc
with this (pas en tant que méthode d'extension) Le résultat de la dernière expression dans le bloc
apply this L'objet lui-même configuré
also it L'objet lui-même configuré

Utilisation :

  • let : Pour effectuer des actions sur un objet pouvant être null, ou pour introduire une variable locale avec un nom plus court.
// Exemple : appel sécurisé d'une méthode sur un objet nullable
val str: String? = "Hello"
str?.let {
    println(it.length) // Ne s'exécute que si str n'est pas null
}
  • run : Pour exécuter un bloc de code avec le contexte de l'objet (comme with), mais en tant que méthode d'extension, ou lorsque vous souhaitez calculer une valeur dans le contexte de l'objet.
// Exemple : configuration d'un objet et obtention du résultat
val configurations = buildList {
    add("Config 1")
    add("Config 2")
}.run {
    println("Applying configurations...")
    joinToString(", ") // Exécuté dans le contexte de List<String>, retourne String
}
println(configurations)
  • with : Pour grouper des appels de méthodes d'un objet sans utiliser de "point" devant chaque appel. Ce n'est pas une méthode d'extension.
// Exemple : regroupement d'appels de méthodes d'un même objet
val person = Person("Alice", 30)
with(person) {
    println(name) // Accès direct aux propriétés
    println(age)
}
  • apply : Pour configurer un objet. Retourne l'objet lui-même configuré. Utile pour créer et initialiser des objets en une seule expression.
// Exemple : création et configuration d'un objet en une étape
val button = Button().apply {
    text = "Click Me"
    onClick = { println("Button clicked") }
}
  • also : Pour effectuer des actions supplémentaires sur un objet, comme la journalisation, après une opération. Retourne l'objet lui-même.
// Exemple : journalisation après une action
val number = 42
val squared = number.also {
    println("Processing number: $it") // Exécuté sur it (number), retourne number
}.run {
    this * this // Exécuté sur this (number), retourne le carré
}
println("Squared value: $squared")

Le choix de la fonction de portée appropriée dépend de ce que vous souhaitez faire avec l'objet et de la valeur qui doit être retournée.