buildString în Kotlin

buildString construiește un text din bucăți cu append și appendLine, apoi îl returnează ca String.

Sintaxă
inline fun buildString(builderAction: StringBuilder.() -> Unit): String
fun StringBuilder.append(value: Any?): StringBuilder
fun StringBuilder.appendLine(value: Any?): StringBuilder

Ce face buildString

buildString { ... } creează un StringBuilder gol și ți-l dă în bloc ca this. În interior apelezi append(x) pentru a adăuga o bucată și appendLine(x) pentru a adăuga bucata urmată de rând nou. La final primești textul gata făcut, ca String.

Spre deosebire de text += bucata într-o buclă, care creează un String nou la fiecare pas, StringBuilder adaugă în același obiect, deci este mult mai rapid pentru texte lungi. append returnează builder-ul, așa că apelurile se pot înlănțui: append(a).append(b).

Poți folosi și direct StringBuilder(), apoi toString() la final; buildString face asta pentru tine.

Parametri

Parametru Descriere
builderAction Blocul în care adaugi text; this este builder-ul.
value Ce se adaugă; orice tip, transformat în text.

Ce returnează

buildString: textul construit (String). append/appendLine: același StringBuilder.

Exemple

Exemplul 1: Un bon de cumpărături

Fiecare produs devine un rând cu appendLine; totalul se adaugă la final.

fun main() {
    val produse = listOf("pâine" to 4.5, "lapte" to 7.2, "mere" to 6.0)
    val bon = buildString {
        appendLine("BON FISCAL")
        for ((nume, pret) in produse) {
            appendLine("$nume: $pret lei")
        }
        append("Total: ").append(produse.sumOf { it.second }).append(" lei")
    }
    println(bon)
}

Rezultat

BON FISCAL
pâine: 4.5 lei
lapte: 7.2 lei
mere: 6.0 lei
Total: 17.7 lei

Exemplul 2: Construire într-o buclă

Adăugăm numerele și separatorul doar între ele, nu și după ultimul.

fun main() {
    val text = buildString {
        for (i in 1..5) {
            if (i > 1) append(", ")
            append(i * i)
        }
    }
    println("Pătrate: $text")
}

Rezultat

Pătrate: 1, 4, 9, 16, 25

Exemplul 3: StringBuilder folosit direct

Același rezultat, fără buildString: creăm builder-ul, adăugăm și apelăm toString().

fun main() {
    val sb = StringBuilder()
    sb.append("Ana")
    sb.append(' ')
    sb.append(21)
    sb.appendLine(" de ani")
    sb.append("Iași")
    println(sb.toString())
    println("Lungime: ${sb.length}")
}

Rezultat

Ana 21 de ani
Iași
Lungime: 18

Greșeli frecvente

  • Construiești un text mare cu += într-o buclă de mii de pași. Fiecare pas copiază tot textul; folosește buildString.
  • Uiți că în buildString rezultatul este textul, nu ultima expresie din bloc: blocul returnează Unit, iar buildString returnează ce ai adăugat.

Comenzi înrudite

  • StringBuilder.insert: Modifică un StringBuilder pe loc: insert adaugă la o poziție, reverse inversează, deleteCharAt șterge un caracter, clear golește.
  • String.repeat: repeat construiește un text din n copii ale textului; plus (operatorul +) lipește două texte.
  • apply: Configurează un obiect într-un bloc în care obiectul este this, apoi returnează chiar obiectul.
  • String.trimIndent: Elimină indentarea comună din textele pe mai multe rânduri scrise cu „”” … „”” în cod.