Ce face Iterable.map
map trece prin fiecare element, îi aplică funcția dată (lambda) și pune rezultatul într-o listă nouă, în aceeași ordine. Lista originală nu se schimbă. Lista nouă are același număr de elemente, dar poate avea alt tip: din List<String> poți obține List<Int> (de exemplu lungimile).
În lambda, elementul curent se numește implicit it: preturi.map { it * 2 }. Poți să-i dai și un nume: map { pret -> pret * 2 }.
mapIndexed îți dă în plus poziția elementului: mapIndexed { index, valoare -> ... }. Funcționează și pe map-uri (map { (cheie, valoare) -> ... }), pe tablouri și pe secvențe.
Parametri
| Parametru | Descriere |
|---|---|
transformare |
Funcția aplicată fiecărui element. Ce întoarce ea devine elementul din lista nouă. |
Ce returnează
O List<R> nouă, cu același număr de elemente.
Exemple
Exemplul 1: Prețuri cu TVA și lungimi de nume
Prima listă păstrează tipul (Double), a doua schimbă tipul din String în Int.
fun main() {
val preturi = listOf(10.0, 25.0, 4.5)
val cuTva = preturi.map { it * 1.19 }
println(cuTva)
val nume = listOf("Ana", "Bogdan", "Ioana")
println(nume.map { it.length })
println(nume.map { n -> n.uppercase() })
println("Originalul nu se schimbă: $preturi")
}
Rezultat
[11.899999999999999, 29.75, 5.3549999999999995]
[3, 6, 5]
[ANA, BOGDAN, IOANA]
Originalul nu se schimbă: [10.0, 25.0, 4.5]
Exemplul 2: Din obiecte în texte
Transformăm fiecare elev într-un rând de raport. Este un tipar foarte des întâlnit: listă de date → listă de texte afișabile.
data class Elev(val nume: String, val medie: Double)
fun main() {
val elevi = listOf(Elev("Ana", 9.45), Elev("Radu", 7.8), Elev("Elena", 8.9))
val randuri = elevi.map { "${it.nume}: ${it.medie} ${if (it.medie >= 9) "(premiu)" else ""}".trim() }
randuri.forEach { println(it) }
}
Rezultat
Ana: 9.45 (premiu)
Radu: 7.8
Elena: 8.9
Exemplul 3: mapIndexed: clasament numerotat
Indexul începe de la 0, așa că adăugăm 1 pentru locul în clasament.
fun main() {
val sosiri = listOf("Mihai", "Ioana", "Vlad")
val clasament = sosiri.mapIndexed { index, nume -> "${index + 1}. $nume" }
println(clasament)
}
Rezultat
[1. Mihai, 2. Ioana, 3. Vlad]
Greșeli frecvente
- Folosești
mapdoar pentru efecte (de exempluprintln) și ignori rezultatul. Pentru asta existăforEach. - Te aștepți ca
mapsă modifice lista originală: întoarce mereu o listă nouă. - Întorci
nulldinmappentru elementele pe care vrei să le sari: obții o listă cunull-uri. FoloseștemapNotNull.
Comenzi înrudite
Iterable.mapNotNull: Aplică o funcție fiecărui element și păstrează doar rezultatele care nu sunt null; firstNotNullOf întoarce primul astfel de rezultat.Iterable.filter: Creează o listă nouă doar cu elementele care îndeplinesc condiția (filterNot: cu cele care nu o îndeplinesc).Iterable.flatMap: flatten unește o listă de liste într-o singură listă; flatMap transformă fiecare element într-o listă și le unește.Iterable.forEach: Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.Iterable.associate: Construiește un map din colecție: pentru fiecare element lambda întoarce o pereche cheie to valoare.