Collections et lambdas
Ce que tu vas apprendre
- Distinguer
List,SetetMap, en lecture seule ou modifiables. - Écrire une lambda et la passer à une fonction.
- Transformer une liste avec
filteretmap.
Trois types de collections
Une collection regroupe plusieurs valeurs. Kotlin en propose trois principales.
| Type | Contenu | Doublons |
|---|---|---|
List | Éléments ordonnés, accessibles par position | Oui |
Set | Éléments uniques | Non |
Map | Paires clé et valeur | Clés uniques |
val ingredients = listOf("farine", "oeufs", "lait", "oeufs")
val etapes = setOf(1, 2, 2, 3)
val temps = mapOf("tarte" to 50, "crêpes" to 20)
println(ingredients[0]) // farine
println(etapes) // [1, 2, 3]
println(temps["tarte"]) // 50
mapOf prend des paires créées avec to. "tarte" to 50 équivaut à Pair("tarte", 50). Lire une clé avec [] renvoie une valeur nullable, puisque la clé peut manquer.
Lecture seule ou modifiable
val lecture: List<String> = listOf("sel", "poivre")
val modifiable: MutableList<String> = mutableListOf("sel")
modifiable.add("poivre")
// lecture.add("huile") // erreur : List n'a pas de add()
List, Set et Map sont en lecture seule : on ne peut ni ajouter ni retirer. Leurs versions MutableList, MutableSet et MutableMap permettent de modifier le contenu.
La documentation recommande les types en lecture seule quand l'appelant n'a pas besoin de modifier la collection. Tu limites ainsi les surprises.
Parcourir une collection
for (nom in ingredients) {
println(nom)
}
Tu connais déjà for. Kotlin offre aussi des fonctions qui font le travail à ta place, et elles reposent sur les lambdas.
Les lambdas
val majuscules = { texte: String -> texte.uppercase() }
println(majuscules("tarte")) // TARTE
Une lambda est un petit morceau de code qu'on peut ranger dans une variable ou passer à une fonction. Elle s'écrit entre accolades : les paramètres, puis ->, puis le corps.
Une lambda sans paramètre s'écrit sans -> : { println("Bonjour") }. Sans type de paramètre explicite, Kotlin a besoin qu'il soit déduisible du contexte.
Passer une lambda à une fonction
val nombres = listOf(1, 2, 3, 4)
val somme = nombres.fold(0) { total, n -> total + n }
println(somme) // 10
Quand la lambda est le dernier paramètre, on l'écrit après les parenthèses. C'est une lambda de fin. Si c'est le seul paramètre, les parenthèses disparaissent aussi.
filter et map
val minutes = listOf(10, 45, 20, 60)
val courtes = minutes.filter { it < 30 }
val enHeures = minutes.map { it / 60.0 }
println(courtes) // [10, 20]
filter garde les éléments pour lesquels la lambda renvoie true. map transforme chaque élément et renvoie une nouvelle liste.
Quand la lambda a un seul paramètre, tu peux l'omettre et utiliser it. Tu peux aussi le nommer, comme dans { m -> m < 30 }, ce qui aide si le code devient long.
Ces fonctions ne modifient pas la liste d'origine. Elles renvoient toujours une nouvelle liste.
Enchaîner les opérations
Prenons une classe de recettes :
data class Recette(val titre: String, val minutes: Int)
val recettes = listOf(
Recette("Crêpes", 20),
Recette("Tarte", 50),
Recette("Salade", 10)
)
val rapides = recettes
.filter { it.minutes <= 30 }
.map { it.titre }
println(rapides) // [Crêpes, Salade]
Chaque appel part du résultat du précédent. On lit la chaîne comme une phrase : « garde les recettes de 30 minutes ou moins, puis prends leur titre ».
Une lambda en retour
fun convertisseur(unite: String): (Int) -> Int = when (unite) {
"heure" -> { v -> v * 60 }
else -> { v -> v }
}
println(convertisseur("heure")(2)) // 120
Une fonction peut renvoyer une lambda. Son type de retour s'écrit alors comme un type de fonction : (Int) -> Int signifie « prend un Int, renvoie un Int ».
À retenir
Listest ordonnée,Setgarde des éléments uniques,Mapassocie des clés à des valeurs.listOf,setOfetmapOfcréent des collections en lecture seule ;mutableListOfet ses équivalents permettent la modification.- Une lambda s'écrit
{ parametre -> corps }et peut être passée à une fonction. - Une lambda placée en dernier paramètre s'écrit après les parenthèses.
filtergarde des éléments,maples transforme : toutes deux renvoient une nouvelle liste.itdésigne l'unique paramètre d'une lambda quand on ne le nomme pas.
Pour aller plus loin
Sources officielles
Ensuite
Classes, data classes et objets
Modéliser tes données avec class et data class, puis utiliser object et companion object pour un singleton ou des fonctions de fabrique.
Coroutines et Jetpack Compose
Lancer des tâches en parallèle avec les coroutines (suspend, launch, async), puis découvrir Jetpack Compose avec des fonctions @Composable.
- Projet
- Lignes de code
- Niveau
- Le quartier
- Appartement
- Kotlin
- Pièce
- 5/7
- Plan n°
- kotlin/05.collections-et-lambdas