Spec-Zone.ru › Kotlin 2

Строки

Тип String представляет собой последовательность символов. Его можно использовать для текстовых значений, таких как слова, предложения, сообщения или структурированный текст.

Тип String является неизменяемым. После создания объекта String его содержимое остается неизменным на протяжении всего срока его существования. Любая операция, которая выглядит как изменение строки, на самом деле создает новую строку.

Объявление строк

Чтобы объявить строковый литерал String, заключите значение в двойные кавычки (""). Тип String можно указать явно или позволить Kotlin вывести его из значения:

val name: String = "Kotlin"
val message = "Hello, world!" // Kotlin infers String

Строковые литералы в двойных кавычках поддерживают escape-последовательности, такие как \n или \t:

val message = "Hello,\nworld!"
val quote = "Kotlin says, \"Hi\"."

Многострочные строки

Чтобы хранить текст, состоящий из нескольких строк, или содержащий кавычки, которые не нужно экранировать, используйте многострочную строку, заключенную в тройные кавычки (""" """):

val text = """
Hello,
Kotlin
"""

val quote = """Kotlin says, "Hi"."""

Многострочные строки не поддерживают escape-последовательности. Kotlin рассматривает эти символы как обычный текст.

Многострочные строки сохраняют переносы строк и отступы в том виде, в котором они записаны в исходном коде. Это удобно, когда требуется, чтобы значение во время выполнения соответствовало расположению текста в файле.

В следующем примере пробелы перед каждой строкой являются частью результирующей строки:

val text = """
    Hello,
    Kotlin
"""

Чтобы удалить общие начальные отступы, используйте функцию trimIndent(). Она определяет минимальный общий отступ непустых строк и удаляет его:

fun main() {
//sampleStart
    val text = """
        Hello,
        Kotlin
    """.trimIndent()
    
    println(text)
//sampleEnd
}

Чтобы точнее управлять удалением отступов, используйте функцию trimMargin(). Она удаляет все символы до префикса поля включительно в каждой строке:

fun main() {
//sampleStart
    val text = """
        |Hello,
        |Kotlin
    """.trimMargin()
    
    println(text)
//sampleEnd
}

По умолчанию функция trimMargin() использует символ вертикальной черты (|) в качестве префикса поля, но в качестве параметра можно передать другой символ. Например: trimMargin(">").

При обработке строки с помощью функций, таких как trimIndent() или trimMargin(), в результирующей строке используются только символы перевода строки (\n), независимо от платформы.

Шаблоны строк

Шаблоны строк позволяют встраивать переменные и выражения непосредственно в строковый литерал String. Этот процесс называется интерполяцией. Шаблоны строк можно использовать как в обычных, так и в многострочных строках.

Чтобы вставить переменную в строку, используйте символ $:

fun main() { 
//sampleStart
    val name = "Kotlin"
    println("Hello, $name") 
    // Hello, Kotlin
//sampleEnd
}

Чтобы вставить выражение в строку или разместить переменную непосредственно рядом с другим текстом, используйте ${}:

fun main() {
//sampleStart
    val text = "abc"
    println("The length of $text is ${text.length}")
    // The length of abc is 3
      
    val language = "Kotlin"
    println("${language}Lang")
    // KotlinLang
//sampleEnd
}

Также можно объединять строки с помощью оператора +. Однако шаблоны строк обычно легче читать, и они более идиоматичны.

Выражения шаблонов также могут содержать строки в двойных кавычках без экранирования:

// Double-quoted string
val test = "${"test".uppercase()}"

// Multiline string
val result = """
Result: ${"OK".lowercase()}
"""

Nullable-значения в шаблонах строк

Если интерполируемое выражение или переменная принимает значение null, компилятор Kotlin вставляет текст null в результирующую строку. Чтобы заменить null другим значением, используйте оператор Элвиса (?:):

fun main(){
//sampleStart
    val text: String? = null
  
    println("Hello, $text")
    // Hello, null

    println("Hello, ${text ?: "Kotlin"}")
    // Hello, Kotlin
//sampleEnd
}

Интерполяция строк с несколькими знаками доллара

В обычных шаблонах строк интерполяция начинается с одного знака доллара ($). Если в строку нужно включить буквальные знаки доллара, используйте интерполяцию строк с несколькими знаками доллара.

Интерполяция строк с несколькими знаками доллара позволяет указать, сколько идущих подряд знаков доллара требуется для начала интерполяции. Знаки доллара, количество которых меньше указанного, считаются обычными символами.

Например, если перед строковым литералом использовать $$, интерполяция начнется только при наличии двух идущих подряд знаков доллара:

val KClass<*>.jsonSchema : String
    get() = $$"""
    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "https://example.com/product.schema.json",
      "$dynamicAnchor": "meta",
      "title": "$${simpleName ?: qualifiedName ?: "unknown"}",
      "type": "object"
    }
    """

Если вы используете интерполяцию строк с одним знаком доллара, интерполяция с несколькими знаками доллара не повлияет на ваш код. Можно продолжать использовать один $ и при необходимости применять несколько знаков доллара.

Основные операции со строками

Kotlin предоставляет широкий набор операций для работы со строками. В этом разделе рассматриваются некоторые из наиболее часто используемых операций.

Подробнее обо всех доступных функциях см. в справочнике API.

Получение длины строки

Чтобы получить количество символов в строке, используйте свойство length:

fun main (){
//sampleStart
    val language = "Kotlin"
    println(language.length)
    // 6
//sampleEnd
}

Доступ к символам

Получить доступ к отдельному символу в строке можно с помощью оператора индексирования ([]):

fun main (){
//sampleStart
    val language = "Kotlin"
    
    println(language[0])
    // K
    println(language[5])
    // n
//sampleEnd
}

Индексы строк начинаются с нуля. Если попытаться обратиться к индексу за пределами допустимого диапазона, Kotlin выдаст исключение.

Также можно перебрать символы строки:

fun main(){
//sampleStart
    for (char in "Kotlin") {
      println(char)
    }
//sampleEnd    
}

Извлечение частей строки

Чтобы извлечь части строки, используйте одну из следующих функций:

  • substring() возвращает новую строку с выбранной частью исходного текста.

  • subSequence() возвращает CharSequence с выбранной частью исходного текста.

Например:

fun main() {
//sampleStart    
    val text = "Kotlin"
    println(text.substring(1))
    // otlin
    println(text.substring(1, 5))
    // otli
    println(text.subSequence(1, 5))
    // otli
//sampleEnd
}

Поскольку тип String является неизменяемым, эти функции не изменяют исходную строку.

Сравнение строк

Проверить, совпадает ли содержимое двух строк, можно с помощью оператора ==:

fun main(){
//sampleStart
    println("kotlin" == "kotlin")
    // true
  
    println("kotlin" == "Kotlin")
    // false
//sampleEnd    
}

Также можно сравнить строки лексикографически (символ за символом) с помощью функции compareTo(). Она просматривает обе строки до первого различающегося набора символов и возвращает:

  • 0, если строки равны.

  • Значение меньше 0, если строка-получатель меньше аргумента.

  • Значение больше 0, если строка-получатель больше аргумента.

fun main() {
//sampleStart    
    println("abc".compareTo("abd") < 0)
    // true
    
    println("abc".compareTo("ABC") > 0)
    // true
    
    // Pass true to ignore case differences
    println("abc".compareTo("ABC", ignoreCase = true) == 0)
    // true
//sampleEnd  
}

Работа с содержимым строки

Чтобы изменить содержимое строки, создайте ее измененную копию с помощью таких функций, как .trim(), .replace(), .uppercase() и .lowercase():

fun main() {
//sampleStart
    val text = "  Hello, Kotlin  "

    println(text.trim())
    // Hello, Kotlin

    println(text.replace("Kotlin", "world"))
    //   Hello, world  

    println(text.uppercase())
    //   HELLO, KOTLIN  

    println(text.lowercase())
    //   hello, kotlin  
//sampleEnd    
}

Также можно проверить содержимое строки с помощью функций contains(), startsWith() и endsWith():

fun main() { 
//sampleStart
    val domain = "kotlinlang.org"
    
    // Checks if the string contains "."
    println(domain.contains("."))
    // true
    
    // Checks if the string starts with "kotlin"
    println(domain.startsWith("kotlin"))
    // true
    
    // Checks if the string ends with ".org"
    println(domain.endsWith(".org"))
    // true
//sampleEnd
}

Разделение строк

Разделить строку на части по разделителю можно с помощью функции split():

fun main() { 
//sampleStart
    val numbers = "one, two, three"
    println(numbers.split(", "))
    // [one, two, three]
//sampleEnd
}

Чтобы разделить строку на отдельные строки, используйте функцию lines():

fun main() { 
//sampleStart
    val numbers = "one\ntwo\nthree"
    println(numbers.lines())
    // [one, two, three]
//sampleEnd
}

Создание и форматирование строк

Для большинства задач форматирования в Kotlin используйте шаблоны строк.

При объединении строк с помощью оператора + Kotlin создает новый объект String для каждой операции. Однако такой подход может быть неэффективен в циклах или при объединении множества фрагментов. Чтобы избежать этих проблем, можно использовать функцию buildString() или StringBuilder. Они собирают все фрагменты в одном изменяемом буфере и в конце создают только одну строку.

Используйте функцию buildString(), если логика, определяющая, что нужно добавить, сложна. Например, если есть несколько условий, каждое из которых добавляет свой фрагмент. При использовании buildString() вам не нужно работать с буфером напрямую. Функция создает StringBuilder внутри, выполняет ваш блок и возвращает результирующую строку.

fun main() {
//sampleStart

    val hasErrors = true
    val hasWarnings = true
    val isComplete = false
    
    // buildString creates an empty buffer
    val status = buildString {
        // Appends "Errors found" to the buffer
        if (hasErrors) append("Errors found")
        if (hasWarnings) {
            // The buffer is not empty, appends "; "
            if (isNotEmpty()) append("; ")
            // Appends "Warnings found"
            append("Warnings found")
        }
        // isComplete = false, nothing to append
        if (isComplete) {
            if (isNotEmpty()) append("; ")
            append("Completed")
        }
        // The buffer is not empty, skips the fallback
        if (isEmpty()) append("OK")
    }
    
    println(status)
    // Errors found; Warnings found
//sampleEnd
}

Используйте StringBuilder, если буфер нужен вам как явное значение. Например, чтобы изменить существующий текст:

fun main() {
//sampleStart
    val text = "Hello, Kotlin"
    val builder = StringBuilder(text)

    builder.replace(7, 13, "world")
    println(builder.toString()) 
    // Hello, world
//sampleEnd
}

На JVM также можно отформатировать строку с помощью функции String.format():

val text = String.format("Hello, %s", "Kotlin") 

Используйте функцию String.format() только в том случае, если вам нужны спецификаторы форматирования в стиле formatter на JVM. Подробнее о спецификаторах формата см. в документации по классу Formatter в Java.

Преобразование строк

Часто строки используются для представления значений других типов, например чисел, значений Boolean или введенных идентификаторов. Kotlin предоставляет функции для преобразования значений в строки и разбора строк в значения других типов.

Чтобы получить строковое представление значения, используйте функцию toString():

val number = 10
val text = number.toString()

В шаблонах строк и при конкатенации строк Kotlin автоматически преобразует значения в строки.

Чтобы преобразовать строку в значение другого типа, используйте соответствующие функции разбора:

  • Для целочисленных значений: toByte(), toShort(), toInt(), toLong()

  • Для чисел с плавающей точкой: toDouble(), toFloat()

  • Для логических значений: toBoolean(), toBooleanStrict()

Если строка имеет допустимый формат, эти функции возвращают значение запрошенного типа. Если входные данные могут быть некорректными, используйте варианты OrNull. Вместо выбрасывания исключения эти функции возвращают null, поэтому они подходят для пользовательского ввода или данных, которые вы не полностью контролируете:

val toInt = "10".toInt() // 10

// 1000000000000 exceeds maximum value of Int
val toIntInvalid = "1000000000000".toIntOrNull()

val toBoolean = "true".toBooleanStrict() // true
val toBooleanInvalid = "yes".toBooleanStrictOrNull() // null
29 июня 2026 г.
СимволыМассивы

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/strings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API