Iterable.map în Kotlin

Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.

Sintaxă
fun <T, R> Iterable<T>.map(transformare: (T) -> R): List<R>
fun <T, R> Iterable<T>.mapIndexed(transformare: (index: Int, T) -> R): List<R>

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 map doar pentru efecte (de exemplu println) și ignori rezultatul. Pentru asta există forEach.
  • Te aștepți ca map să modifice lista originală: întoarce mereu o listă nouă.
  • Întorci null din map pentru elementele pe care vrei să le sari: obții o listă cu null-uri. Folosește mapNotNull.

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.