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

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

Шкодим

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

Базовые типы

Any

В Kotlin нет примитивных типов int, float, double и т.д., всё является объектами. Соответственно, вместо примитивных типов используются объекты Int (не Integer как в Java), Double, Char, Float, Long, Boolean.

Float и Double являются числами с плавающей точкой и могут содержать 32 и 64 бита соответственно.

В Kotlin 1.3 появились беззнаковые типы: UByte (0...255), UShort (0...65535), UInt (0...2^32 - 1), ULong (0...2^64 - 1).


// You can define unsigned types using literal suffixes
val uint = 42u 
val ulong = 42uL
val ubyte: UByte = 255u

// You can convert signed types to unsigned and vice versa via stdlib extensions:
val int = uint.toInt()
val byte = ubyte.toByte()
val ulong2 = byte.toULong()

// Unsigned types support similar operators:
val x = 20u + 22u
val y = 1u shl 8
val z = "128".toUByte()
val range = 1u..5u

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


val x: Int = 20
val y: Long = x // нельзя
val y: Long = x.toLong()

Присвоить значение одного типа переменной другой типа можно при помощи специальных функций toByte(), toInt(), toLong(), toFloat(), toDouble(), toChar(), toShort(). Одну мы уже использовали выше.


val i: Int = 9
val d: Double = i.toDouble()

Переводим строку в число.


val stringNumber = "101"
val intValue = stringNumber.toInt()

val intValue = "101".toInt() // так тоже можно

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


val i = 9 // Int
val iHex = 0x0f // Int в шестнадцатеричной записи
val l = 5L // Long
val d = 3.6 // Double
val f = 3.6F // Float

Можно представить число в двоичном коде, добавив префикс 0b. Для представления в шестнадцатеричной форме используется префикс 0x. Восьмеричная форма не поддерживается.


x = 0b10
y = 0xAB

Char

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


val letter: Char = 'c'
println("Current value of 'letter' is " + letter)

if (letter is Char) {
    println("It is a character")
} else {
    println("It is not character")
}

Если из контекста понятно, о каком типе идёт речь, то его можно опустить.


val letter = 'c'  // понятно, что это Char

Тип Char нельзя использовать как число (как в Java), поэтому прибегаем к функции.


val c: Char = 'c'
val i: Int = c.toInt()

Аналогично используем toByte() и др. похожие функции.

Функции проверки регистра символа и перевода в верхний или нижний регистр.


val hello = "Hello Kitty!"
for (c in hello) {
    when {
        c.isLowerCase() -> print(c.toUpperCase())
        c.isUpperCase() -> print(c.toLowerCase())
        else -> print(c)
    }
}

// hELLO kITTY!

Для проверки, является ли символ цифрой или буквой, используем Char.isDigit() и Char.isLetter().


Битовые операции происходят иначе. Если в Java используются специальные символы для сравнения: | для ИЛИ (OR) или & для И (AND), то в Kotlin не нужно запоминать, пишем словами.


val kotOR = FLAG1 or FLAG2
val kotAND = FLAG1 and FLAG2

Другие виды побитовых операторов: shl (signed shift left (Java <<)), shs (signed shift right (Java >>)), ushr (unsigned shift right (Java >>>)), xor, inv.

Any

Матерью всех типов является Any, который похож на тип Object в Java. Зададим целое число и строку через данный тип.


val anyNumber: Any = 42
val anyString: Any = "42"
Реклама