1. Изучаем подробнее тип String
Тип String — один из самых используемых типов в Kotlin. Возможно, вообще самый используемый. Это просто великолепный тип, ведь в таких переменных можно хранить текст. А еще, в отличие от типов Int и Double, у объектов типа String есть куча различных функций, и с помощью этих функций можно делать различные интересные вещи.
Кроме того, все объекты в Kotlin (вообще все) могут быть преобразованы в тип String. Ну или, если сказать более корректно, все объекты в Kotlin возвращают свое текстовое (строковое) представление. Мы будем еще не раз возвращаться к этому типу (очень уж он полезный и интересный), но сегодня познакомимся с его основами.
Создание переменных типа String
Тип String создан для хранения строк (текста). Чтобы создать в коде переменную, которая будет способна хранить текст, нужно воспользоваться командой:
var имя: String
Где имя — это имя переменной.
Примеры:
| Команда | Описание |
|---|---|
|
Создается строковая переменная name |
|
Создается строковая переменная message |
|
Создается строковая переменная text |
Так же, как с типами Int и Double, можно создавать несколько переменных типа String.
В Kotlin запись через запятую, как в Java (String a, b;), не используется — переменные объявляют отдельно:
fun main() {
var имя1: String
var имя2: String
var имя3: String
}
2. Присваивание значений переменным типа String
Чтобы занести в переменную типа String значение, нужно воспользоваться командой:
имя = "значение"
А вот и первое отличие типа от уже изученных. Все значения типа String представляют собой строки текста и должны быть заключены в двойные кавычки.
Примеры:
| Команда | Примечание |
|---|---|
|
Переменная name содержит текст Аня |
|
Переменная city содержит текст New York |
|
Переменная message содержит текст Hello! |
3. Инициализация переменных типа String
Как и в случае с типами Int и Double, переменные типа String можно инициализировать сразу при создании. Это, кстати, можно делать вообще со всеми типами в Kotlin. Так что больше мы об этом говорить не будем.
fun main() {
var имя1: String = "значение1"
var имя2: String = "значение2"
var имя3: String = "значение3"
}
fun main() {
var name: String = "Аня"
var city: String = "New York"
var message: String = "Hello!"
}
Менять можно только переменные со значением
Kotlin-компилятор будет ругаться, если вы объявите переменную, не присвоив ей никакого значения, и попробуете ее использовать.
Такой код работать не будет:
fun main() {
var name: String
println(name) // Переменная name не инициализирована. Программа не скомпилируется.
}
fun main() {
var a: Int
a++ // Переменная a не инициализирована. Программа не скомпилируется.
}
fun main() {
var x: Double
val y = x // Переменная x не инициализирована. Программа не скомпилируется.
}
4. Конкатенация — склеивание строк
Есть очень интересная и простая вещь, которую можно делать со строками в Kotlin — их можно склеивать. Такая операция называется конкатенация. Ну или чтобы легче запомнилось — Кон-Котэ-Нация 😆. Хотя часто ее называют «склеивание строк» или даже просто «сложение строк».
Чтобы склеить две строки, нужно использовать знак +. Это очень просто:
val result = "строка1" + "строка2"
Примеры:
| Команда | Примечание |
|---|---|
|
name содержит строку АняАня |
|
city содержит строку New YorkАня |
|
message содержит строку Hello! Аня |
Ну и, конечно, одновременно можно складывать много строк, а также складывать строки и переменные.
Примеры:
fun main() {
val name = "Аня" // name содержит строку Аня
val city = "New York" // city содержит строку New York
val message = "Hello!" + city + name + city // message содержит строку Hello!New YorkАняNew York
}
5. Пустые строки
В последнем примере видно, что текст в переменной message плохо читается, т.к. в нем не хватает пробелов. Чтобы задать один пробел или несколько, нужно просто написать их в коде и обернуть в двойные кавычки. Это проще, чем кажется:
" "
Кстати, если между кавычками совсем не оставить места (написать две двойные кавычки подряд), получится так называемая «пустая строка»:
""
С одной стороны, она вроде бы и есть, а с другой, при ее выводе на экран ничего не выводится. И при склейке с другими строками ничего не происходит. Эдакий аналог нуля, только для строк.
6. Экранирование спецсимволов в строках
Вы уже знаете, что строки обрамляются двойными кавычками. Но что делать, если нужно вставить в строку кавычки? Если мы напишем кавычки в строке, разве компилятор не посчитает их как окончание строки?
Правильно. Посчитает. Поэтому кавычки внутри текста заменяются парой символов \". И код будет выглядеть вот так:
fun main() {
val quote = "Он сказал: \"Здравствуйте!\""
println(quote) // Он сказал: "Здравствуйте!"
}
На самом деле все еще немного хитрее. Символ \ считается специальным (управляющим) символом внутри строк. С его помощью можно задавать различные "непечатные символы" типа переноса строки, табуляции и т.п. Ну а чтобы задавать сам символ \, его нужно написать 2 раза.
Вот 4 самые распространённые комбинации:
| Запись | Значение |
|---|---|
|
Перенос строки (newline) |
|
Табуляция (отступ) |
|
Буквально \ |
|
Кавычки внутри строки |
Пример:
fun main() {
val multiline = "Строка 1\nСтрока 2"
println(multiline)
}
Выведет:
// Строка 1
// Строка 2
7. Собственные функции строк
У типа String есть собственные функции (их еще называют методами). Их очень много, и они облегчают жизнь программистам. Сегодня вы познакомитесь с некоторыми (самыми простыми) из них. Пример:
| Функция | Описание | Пример результата |
|---|---|---|
|
Длина строки | |
|
В верхний регистр | |
|
В нижний регистр | |
|
Удалить пробелы по краям | |
Примеры работы с функциями строк
Все эти функции вызываются вот так: переменная.функция(...).
Определить длину строки:
fun main() {
val name = "Андрей"
val length = name.length
println(length) // 6, так как 6 букв
}
Перевести строку в верхний или нижний регистр:
fun main() {
val original = "Привет"
println(original.uppercase()) // ПРИВЕТ
println(original.lowercase()) // привет
}
Удалить пробелы по краям (очень полезно при вводе с клавиатуры):
fun main() {
val messy = " hello "
println(messy.trim()) // "hello"
}
Каждая такая функция возвращает новую строку, старая строка при этом не меняется.
8. String templates
$name: подставляем значения в строку
Когда конкатенаций становится много, строка начинает выглядеть как лапша из кавычек, плюсов и пробелов. Kotlin предлагает очень практичный синтаксис — string templates (строковые шаблоны): внутри строки можно написать $name, и Kotlin подставит значение переменной. Это часть базового синтаксиса языка.
Вам достаточно просто написать имя переменной со знаком доллар и Kotlin сам подставит ее значнеие прямо в текст:
fun main() {
val cafe = "Byte & Coffee"
val item = "Latte"
val price = 180
println("=== $cafe ===") // === Byte & Coffee ===
println("Позиция: $item") // Позиция: Latte
println("Цена: $price ₣ ") // Цена: 180
}
Согласитесь, глазам стало легче. И вам, и тем, кто будет читать ваш код.
${expr}: вставляем выражения
$name работает, когда нужно подставить простое имя (переменную). Но часто хочется подставить результат вычисления: сумму, произведение, выражение со скобками. Для этого используется форма ${...}.
Просто добавьте фигурные скобки и в них можно писать любые выражения:
fun main() {
val item = "Latte"
val price = 180
val count = 2
println("Позиция: $item")
println("Цена за 1: $price ₣ ")
println("Количество: $count")
println("Итого: ${price * count} ₣ ") // Итого: 360 ₣
}
Здесь внутри ${...} обычное выражение price * count, которое вы уже умеете читать благодаря прошлой лекции про Int.
Конкатенация vs templates
Когда выбирать +, а когда templates? В большинстве случаев templates удобнее. Kotlin даже в рекомендациях по стилю отдельно подчёркивает идею: фигурные скобки в шаблонах стоит использовать для выражений, а простую переменную вставлять как $name.
| Задача | Конкатенация + | String templates |
|---|---|---|
| Вставить переменную | |
|
| Вставить выражение | |
|
| Не забыть пробелы | Нужно руками следить за " " | Обычно меньше “склеек”, легче заметить |
| Читаемость | Падает при длинных строках | Обычно выше |
Конкатенация не запрещена и иногда уместна, особенно если вы собираете строку из многих кусочков поэтапно. Но для обычных сообщений пользователю templates почти всегда проще.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ