Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Строки

Пробежаться по строке
Конвертируем строку в число
Дополняем строку символами
StringBuilder

Со строками в Kotlin работать стало проще.

Поздороваемся с котом по имени Барсик.


val catName: String = "Барсик"
println("Привет $catName! Как дела?")

Обратите внимание, что мы добавили знак доллара к имени переменной и используем её прямо в строке. В Java нам пришлось бы разбивать строку и соединять её с помощью конкатенации.


// Java
println("Привет " + catName + "! Как дела?");

Кстати, такой код тоже будет работать, но первый способ гораздо удобнее.

Мы понимаем, что речь идёт о строке, поэтому можно было написать код без указания типа.


val catName = "Барсик"

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


println("Привет \$catName! Как дела?")
// выводится: Привет $catName! Как дела?

Мы использовали так называемый "строковый шаблон". За кулисами происходит соединение при помощи StringBuilder, но более удобным и быстрым способом.

Пробежаться по строке

Строку можно рассматривать как массив символов.


val cat = "Барсик"
val character = cat[2]
println(character) // выводит р

Пробежаться по всей строке.


val cat = "Барсик"
for(char in cat){
    println(char)
}

Саму строку можно предварительно явно перевести в массив символов.


for(char in cat.toCharArray()){
    println(char)
}

Можно вызывать forEach.


cat.forEach { char -> println(char) }

Если вам нужен не только символ строки, но и его индекс, то вызываем forEachIndexed.


cat.forEachIndexed{index, char -> println("Index $index Character $char")}

// Результат
Index 0 Character Б
Index 1 Character а
Index 2 Character р
Index 3 Character с
Index 4 Character и
Index 5 Character к

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


val cat = "Барсик"
val index = 5
println("Character at index $index in $cat is ${cat[index]}")

Если вы укажете несуществующий индекс, то получите исключение StringIndexOutOfBoundsException, поэтому делайте проверку.

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


val a: Int = 9
val b: Int = 1

fun main(args: Array<String>) {
    println("Осталось жизней: ${a - b}")
}

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

Выведем второй элемент массива.


fun main(args: Array<String>) {
    val names = arrayListOf("Мурзик")
    names.add("Васька")
    names.add("Барсик")
    
    println("Кота зовут ${names[0]}")
}

Опять используем знак доллара и фигурные скобки.

Можно даже использовать условие.


val count = 9
print("value of count is ${if (count == 10) "equal to 10" else "not equal to 10"}")

Многострочный текст можно создать, используя тройные кавычки. Больше нам не нужны символы перевода строки \n, а также символы типа \t, \b, \r и т.д.


val multipleStringLines = """
    У лукоморья дуб зелёный;
    Златая цепь на дубе том:
    И днём и ночью кот учёный
    Всё ходит по цепи кругом;
    Идёт направо - песнь заводит,
    Налево - сказку говорит. """

Метод trimMargin() позволяет убрать "пустые" символы из текста по разделителю | (по умолчанию):


val myString = """This is the first line
|This is the second line
    |This is the third line
        |And fourth line
"""
println(myString.trimMargin())

На выходе получим.


This is the first line
This is the second line
This is the third line
And fourth line

Можно задать свой собственный разделитель и указать его в методе.


trimMargin(">")

Можем делать со строкой знакомые операции в удобной обёртке.


val cat = "Барсик"
println(cat.reversed()) // кисраБ
println(cat.takeLast(2)) // ик

val kitty = "murzik@gmail.com"
println(kitty.substringBefore("@")) // murzik

Конвертируем строку в число

Сконвертировать строку в число можно через соответствующие методы.


val str = "123"
print(str.toLong())

Если нужно обработать ситуацию с null, то используйте другой метод.


val str = "123.4"
println(str.toLongOrNull()) // вернёт null

По умолчанию мы подразумеваем десятичное счисление. Но возможна конвертация в другой системе счисления - двоичной, восьмиричной и т.д.


val str = "11111111"
print(str.toLongOrNull(2)) //255

val str = "105"
print(str.toLongOrNull(8)) //69

Также есть схожие методы toShort(), toShortOrNull(), toInt(), toIntOrNull(), toFloat(), toDouble() и т.д. Часть из них поддерживает перегруженные версии с другой системой счисления, но проверяйте поддерживаемые системы.

Не совсем про числа, но можно сконвертировать в булево значение.


val str = "false"
println(str.toBoolean())

Дополняем строку символами

Можно дополнить строку символами с самого начала или в конце.


val name = "Barsik"
val pad = name.padStart(10, '#')
println(pad) // ####Barsik

val name = "Barsik"
val pad = name.padEnd(10, '*')
println(pad) // Barsik****

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

Встроенные функции

Kotlin содержит множество встроенных удобных функций для работы со строками. Часть из них уже использовалась в примерах выше. Упомянем ещё несколько полезных функций.


val blank = "   ".isBlank() // true, если пустая строка или пустые символы пробела, табуляции и т.п.

// подстрока до первого указанного разделителя
val first = "developer.alexanderklimov.ru".substringBefore('.') // developer

// подстрока после первого указанного разделителя
val last = "developer.alexanderklimov.ru".substringAfter('.') // alexanderklimov.ru

// подстрока после последнего указанного разделителя
val last = "developer.alexanderklimov.ru".substringAfterLast('.') // ru

// подстрока до последнего указанного разделителя
val beforeLast = "developer.alexanderklimov.ru".substringBeforeLast('.') // developer.alexanderklimov

val withSpaces = "1".padStart(2) // добавляем пробел перед строкой
val endZeros = "1".padEnd(3, '0') // "100"  добавляем нули в конец

val dropStart = "Kotlin".drop(2) // "tlin" убираем первые символы в указанном количестве
val dropEnd = "Kotlin".dropLast(3) // "Kot" убираем последние символы в указанном количестве

"A\nB\nC".lines() // [A, B, C]
"ABCD".zipWithNext() // [(A, B), (B, C), (C, D)]

Для замены используется replace() с регулярным выражением. Создадим функцию перевода строки на "драконий" язык. В результате будет создана новая строка с нужными символами.


private fun toDragonSpeak(phrase: String) =
        phrase.replace(Regex("[aeiou]")) {
            when (it.value) {
                "a" -> "4"
                "e" -> "3"
                "i" -> "1"
                "o" -> "0"
                "u" -> "|_|"
                else -> it.value
            }
        }
		
println(toDragonSpeak("Kitten")) // K1tt3n

StringBuilder

У класса StringBuilder в Kotlin есть отдельная функция buildString(), которая поможет сократить количество кода для получения строки.


fun printAlphabet() = buildString {
    for (letter in 'A'..'Z')
        append(letter)
}
Реклама