Конкатенация строк
Обсудим возможности строк в Котлине. Представим, что мы программируем бота, который будет приветствовать новых пользователей по имени и сообщать какую-нибудь информацию. Для этого распечатаем такую строку.
println("Какой будет ваш главный вопрос?
Задача добавить к исходной строке приветствие. Самое простое, что можно сделать со строками – это складывать их между собой. Еще это называется конкатенация строк. Складывать строки можно с помощью знака ‘+’.
Введем дополнительные переменные. Строку с приветствием и переменную, в которой будем хранить короткую строку – просто пробел. Так как пробел – это всего лишь один символ, сделаем переменную типа Char, проинициализировав ее значение в одинарных кавычках.
Соберем строку как конструктор, связывая элементы между собой знаками ‘+’. Вот так будет выглядеть сложение строковых литералов (литерал – простыми словами это значение, которое напрямую объявили в коде). То есть вот так будет выглядеть сложение нескольких строк (или конкатенация).
val greetings = "Здравствуйте"
val space = ' '
println(greeting + "!" + space + "Какой будет ваш главный вопрос?")
Отлично, мы получили строку с приветствием. Расширим функционал, добавим обращение по имени. Подразумевается, что имя пользователя всегда будет разное, поэтому вынесем его в отдельную переменную.
val userName = "Звездный Лорд"
Теперь внедрим обращение в сообщение. Это один из работающих, но не общепринятых способов – складывать литерал и переменную с помощью знака плюс.
println(greetings + ", " + userName + "!" + space + "Какой" + space + "будет ваш главный вопрос?")
Строковые шаблоны (интерполяция строк)
Теперь смотрите, нагромождение кавычек и операторов сложения сложно читается и повышает риск совершить ошибку. И Kotlin позволяет изящно реализовать отображение значения переменной прямо в единой строке, используя строковые шаблоны (или шаблонные строки). По-другому эта функция языка называется интерполяция строк.
Фокус в том, что мы пишем требуемый текст и вставляем переменную прямо в строку без дополнительных знаков сложения. А чтобы переменная userName не была просто текстом, а стала носителем и передатчиком значения, необходимо добавить знак ‘$’ перед переменной. Теперь она выделена цветом для дополнительной наглядности и кликабельна.
При запуске интерпретатор увидит в строковом литерале переменную и подставит туда значение. Переменная space нам больше не нужна, ведь это грубо говоря теперь одна непрерывная строка с естественными пробелами. Такой шаблон строки можно создавать с любыми типами, в том числе с выражениями, с методами, логическими ветвлениями if else и так далее.
println("$greetings, $userName! Какой будет ваш главный вопрос?")
Но, чтобы сделать строковый шаблон с неким выражением, там, где просто переменной недостаточно, это выражение нужно поместить в фигурные скобки. И перед скобками точно также ставим знак ‘$’, чтобы это больше не было обычной строкой. Теперь при запуске метода вывода в консоль, выражение в фигурных скобках сначала выполнится, а затем на его месте в строке будет выведен результат.
println("На который можно ответить ${40 + 2}")
Вывод в консоль:
На который можно ответить 42
Многострочное интерполирование в Kotlin
Еще одна из отличительных возможностей языка – удобная запись многострочного текста. За многострочный текст в Котлине отвечает оператор тройные кавычки. Объявим переменную и начнем инициализировать ее в виде многострочной строки в тройных кавычках.
Функция trimIndent()
Смотрите, среда разработки автоматически добавила вызов функции trimIndent(), применимую к нашей строке. Эта функция проводит дополнительную оптимизацию – обнаруживает общий минимальный отступ (слева) у всех строк и удаляет его из каждой строки.
Вот пример. Проинициализируем переменную такой многострочной записью. Добавим рандомные отступы слева. Выведем значение переменной в консоль.
val multiString = """
строка 1
строка 2
строка 3
""".trimIndent()
println(multiString)
Как мы видим, из трех строк минимальный отступ слева оказался у второй – он и был вырезан во всех строках.
строка 1
строка 2
строка 3
Для явной демонстрации зачем нужна эта функция – удалим ее и перезапустим программу. Все оригинальные отступы сохранены.
val multiString = """
строка 1
строка 2
строка 3
"""
println(multiString)
строка 1
строка 2
строка 3
Функция trimMargin()
Но можно отобразить вывод еще изящнее. Мы можем все строки с разными отступами приравнять к левому краю одинаково. Для этого надо изменить функцию для нашей строки на trimMargin() и добавить символы вертикальной черты в начале каждой строки. И получим ровный отформатированный текст.
val multiString = """
|строка 1
|строка 2
|строка 3
""".trimMargin()
println(multiString)
строка 1
строка 2
строка 3
Где это может применяться? Например, если мы хотим написать целую функцию, используя многострочное интерполирование. А, как правило, если логика выглядит чуть сложнее, чем обычный текст, следует писать ее с соблюдением отступов для ее функциональности, читабельности и вообще красоты.
Для тех, кто собрался стать Android-разработчиком
Пошаговая
схема
Описание процесса обучения от основ Kotlin до Android-разработчика
Бесплатные
уроки
Авторский бесплатный курс по основам языка программирования Kotlin
Обучающий
бот
Тренажер и самоучитель по Котлин – бесплатные тесты и практика