Українська
Рядки та шаблони рядків
Незмінність рядка та символи
Операції trim, replace і uppercase повертають новий рядок. Виклик без присвоєння або використання результату не змінює початкову змінну. String можна обходити через for, читати символ за індексом і порівнювати за вмістом через ==. Для порівняння без регістру є equals(other, ignoreCase = true).
length на JVM рахує UTF-16-кодові одиниці. Деякі символи поза базовою багатомовною площиною представлені парою Char; комбінована літера може складатися з кількох кодових точок. Тому перестановка Char не завжди є коректним переставленням видимих символів. Для навчальних алгоритмів явно задавайте алфавіт.
Char.isDigit() розпізнає більше цифр, ніж лише ASCII0..9. Якщо формат протоколу дозволяє лише десяткові ASCII-цифри, перевіряйте character in '0'..'9'. isLetter корисний для широкого поняття літери, але не доводить належність конкретному алфавіту. uppercaseChar повертає один Char і не охоплює всі перетворення, які можуть вимагати кількох символів.
Шаблони й багаторядкові літерали
$name вставляє просту змінну, а ${expression} – значення виразу. Для злиття імені з буквами поруч потрібні фігурні дужки, інакше компілятор може прочитати довше ім’я. Nullable-значення перетворюється на текст null; якщо потрібна інша позначка, використайте Elvis-оператор у шаблоні.
Звичайний рядок підтримує escape-послідовності \n, \t, \" і \\. Багаторядковий літерал у потрійних лапках зберігає переноси й не обробляє такі escape-послідовності. trimIndent прибирає спільний відступ, trimMargin – частину рядка до заданого маркера, типово вертикальної риски.
У Kotlin 2.4.20 підтримується інтерполяція з кількома доларами. Префікс $$ перед літералом означає, що вставлення починають дві послідовні позначки долара; один долар залишається текстом. Це корисно для JSON-схем, шаблонів команд і тексту з цінами.
kotlin
fun main() {
val name = "Ada"
val text = $$"""Cost $10; user=$$name"""
println(text)
val missing: String? = null
println("User: ${missing ?: "anonymous"}")
}text
Cost $10; user=Ada
User: anonymousПошук, зрізи та форматування
substring(start, end) використовує напіввідкритий інтервал: початок включено, кінець ні. Різниця індексів дорівнює довжині результату в кодових одиницях. Неправильні межі спричиняють виняток. Після indexOf потрібно перевірити -1, а не одразу передавати результат як індекс зрізу.
split повертає частини за роздільником; це ще не доказ правильності формату. У записі name;score перевіряють і кількість частин, і кожне поле. trim прибирає крайні пробіли, але не нормалізує всі пробіли всередині. replace може означати буквальну заміну або заміну за Regex залежно від типу аргументу.
padStart і padEnd доповнюють до мінімальної довжини, але не обрізають довгий рядок. repeat потребує невід’ємної кількості повторень. Для таблиці слід окремо визначити, що робити із занадто довгим значенням: відхилити, перенести чи скоротити.
JVM-форматування String.format(Locale.ROOT, "%.2f", value) задає відтворювану десяткову крапку. Без явної локалі формат може залежати від середовища. Формат для людини й формат для машинного обміну даними можуть мати різні вимоги.
StringBuilder і поступове формування тексту
Багаторазове result += piece в циклі може створювати багато проміжних рядків. StringBuilder накопичує фрагменти у змінюваному буфері, а toString() формує результат. Він також має операції вставлення, заміни й видалення за індексами.
buildString { append(...); appendLine(...) } є коротким способом використати локальний будівник. Фігурні дужки тут задають блок роботи з ним; докладно лямбди з приймачем вивчатимуться в темі 11. У прикладах достатньо розуміти, що append додає фрагмент до майбутнього рядка.