Оглавление
Благодарности .................................................................................................... 16
Представляем Kotlin ............................................................................................19
Почему Kotlin? ....................................................................................................... 19
Для кого эта книга?............................................................................................... 20
Как пользоваться этой книгой ............................................................................... 20
Для любопытных.............................................................................................. 21
Задания............................................................................................................ 21
Типографские соглашения ............................................................................... 21
Заглядывая вперед................................................................................................ 22
От издательства .................................................................................................... 22
Глава 1. Ваше первое приложение на Kotlin .............................................................. 23
Установка IntelliJ IDEA........................................................................................... 23
Ваш первый проект на Kotlin.................................................................................. 24
Ваш первый файл на Kotlin............................................................................... 29
Запуск вашего файла на языке Kotlin................................................................ 31
Kotlin REPL............................................................................................................. 33
Для любопытных: зачем использовать IntelliJ? ...................................................... 35
Для любопытных: программирование для JVM ...................................................... 36
Задание: арифметика REPL.................................................................................... 37
Глава 2. Переменные, константы и типы................................................................... 38
Типы ..................................................................................................................... 38
Объявление переменной ....................................................................................... 39
6 Оглавление
Встроенные типы языка Kotlin................................................................................ 41
Переменные, доступные только для чтения........................................................... 42
Автоматическое определение типов ...................................................................... 46
Константы времени компиляции............................................................................ 47
Изучаем байт-код Kotlin......................................................................................... 49
Для любопытных: простые типы Java в Kotlin ........................................................ 52
Задание: hasSteed ................................................................................................. 53
Задание: «Рог единорога»..................................................................................... 53
Задание: волшебное зеркало................................................................................. 54
Глава 3. Условные конструкции................................................................................. 55
Операторы if/else................................................................................................... 55
Добавление условий ........................................................................................ 59
Вложенные операторы if/else ........................................................................... 61
Более элегантные условные выражения........................................................... 62
Интервалы............................................................................................................. 69
Условное выражение when ................................................................................... 70
Шаблонные строки ................................................................................................ 73
Задание: пробуем интервалы ................................................................................ 74
Задание: вывод расширенной информации об ауре............................................... 75
Задание: настраиваемый формат строки состояния............................................... 76
Глава 4. Функции ...................................................................................................... 77
Выделение кода в функции ................................................................................... 77
Анатомия функции ................................................................................................ 80
Заголовок функции .......................................................................................... 80
Тело функции................................................................................................... 83
Область видимости функции ............................................................................ 84
Вызов функции...................................................................................................... 85
Рефакторинг функций ........................................................................................... 86
Пишем свои функции............................................................................................. 88
Аргументы по умолчанию ...................................................................................... 90
Функции с единственным выражением .................................................................. 91
Оглавление   7
Функции с возвращаемым типом Unit .................................................................... 92
Именованные аргументы функций......................................................................... 94
Для любопытных: тип Nothing ............................................................................... 95
Для любопытных: функции уровня файла в Java ................................................... 96
Для любопытных: перегрузка функций.................................................................. 97
Для любопытных: имена функций в обратных кавычках........................................ 99
Задание: функции с единственным выражением ................................................. 100
Задание: дурманящий эффект fireball .................................................................. 100
Задание: состояние одурманивания..................................................................... 101
Глава 5. Анонимные функции и функциональные типы ........................................... 102
Анонимные функции............................................................................................ 102
Функциональные типы ................................................................................... 104
Неявный возврат ................................................................................................. 106
Функциональные аргументы................................................................................ 106
Ключевое слово it................................................................................................ 107
Получение нескольких аргументов ...................................................................... 108
Поддержка автоматического определения типов................................................. 109
Объявление функции, которая принимает функцию............................................ 110
Сокращенный синтаксис ...................................................................................... 111
Встроенные функции........................................................................................... 112
Ссылка на функцию............................................................................................. 114
Тип функции как возвращаемый тип ................................................................... 116
Для любопытных: лямбды Kotlin — это замыкания............................................... 117
Для любопытных: лямбды против анонимных внутренних классов ...................... 118
Глава 6. Null-безопасность и исключения ................................................................ 120
Nullability ............................................................................................................. 120
Явный тип null в Kotlin ......................................................................................... 122
Время компиляции и время выполнения.............................................................. 123
Null-безопасность ................................................................................................ 124
Первый вариант: оператор безопасного вызова ............................................. 125
Вариант второй: оператор !!........................................................................... 127
8 Оглавление
Третий вариант: проверить значение на равенство null.................................. 128
Исключения......................................................................................................... 131
Возбуждение исключений .............................................................................. 132
Пользовательские исключения....................................................................... 134
Обработка исключений .................................................................................. 135
Проверка условий .......................................................................................... 137
Null: что в нем хорошего?.................................................................................... 139
Для любопытных: проверяемые и непроверяемые исключения ........................... 140
Для любопытных: как обеспечивается поддержка null? ....................................... 141
Глава 7. Строки....................................................................................................... 143
Извлечение подстроки......................................................................................... 143
substring......................................................................................................... 143
split ................................................................................................................ 146
Работа со строками ............................................................................................. 148
Строки неизменяемы...................................................................................... 150
Сравнение строк.................................................................................................. 150
Для любопытных: Юникод................................................................................... 152
Для любопытных: обход символов в строке......................................................... 153
Задание: улучшить драконий язык ...................................................................... 154
Глава 8. Числа ........................................................................................................ 155
Числовые типы.................................................................................................... 155
Целочисленные значения .................................................................................... 157
Дробные числа .................................................................................................... 158
Преобразование строки в число .......................................................................... 159
Преобразование Int в Double............................................................................... 160
Форматирование значений типа Double............................................................... 162
Преобразование Double в Int............................................................................... 163
Для любопытных: манипуляции с битами ............................................................ 165
Задание: сколько осталось пинт .......................................................................... 166
Задание: обработка отрицательного баланса ...................................................... 166
Задание: драконьи монеты.................................................................................. 166
Оглавление   9
Глава 9. Стандартные функции .............................................................................. 167
apply.................................................................................................................... 167
let........................................................................................................................ 168
run ...................................................................................................................... 170
with ..................................................................................................................... 171
also...................................................................................................................... 172
takeIf................................................................................................................... 172
takeUnless............................................................................................................ 173
Использование стандартных функций.................................................................. 174
Глава 10. Списки и множества ................................................................................ 175
Списки................................................................................................................. 175
Доступ к элементам списка ................................................................................. 177
Границы индексов и безопасный доступ по индексу ....................................... 178
Проверяем содержимое списка............................................................................ 179
Меняем содержимое списка................................................................................. 180
Итерация............................................................................................................. 184
Чтение файла в список........................................................................................ 189
Деструктуризация................................................................................................ 191
Множества .......................................................................................................... 191
Создание множества ...................................................................................... 192
Добавление элементов в множество............................................................... 193
Цикл while ........................................................................................................... 196
Оператор break.................................................................................................... 198
Преобразование коллекций ................................................................................. 199
Для любопытных: типы массивов ........................................................................ 200
Для любопытных: «только для чтения» вместо «неизменяемого» ....................... 201
Задание: форматированный вывод меню таверны............................................... 203
Задание: улучшенное форматирование меню таверны ........................................ 203
Глава 11. Ассоциативные массивы .......................................................................... 204
Создание ассоциативного массива....................................................................... 204
Доступ к значениям в ассоциативном массиве..................................................... 206
10 Оглавление
Добавляем записи в ассоциативный массив......................................................... 208
Изменяем значения в ассоциативном массиве ..................................................... 210
Задание: вышибала в таверне ............................................................................. 214
Глава 12. Объявление классов ................................................................................ 215
Объявление класса.............................................................................................. 215
Создаем экземпляры ........................................................................................... 216
Функции класса ................................................................................................... 217
Доступность и инкапсуляция ............................................................................... 218
Свойства класса .................................................................................................. 220
Методы свойств................................................................................................... 222
Видимость свойств .............................................................................................. 225
Вычисляемые свойства ........................................................................................ 226
Рефакторинг NyetHack......................................................................................... 227
Использование пакетов ....................................................................................... 235
Для любопытных: более пристальный взгляд на свойства var и val .................... 236
Для любопытных: защита от состояния гонки ..................................................... 240
Для любопытных: ограничение видимости рамками пакета................................. 241
Глава 13. Инициализация ...................................................................................... 243
Конструкторы...................................................................................................... 244
Главный конструктор........................................................................................... 244
Объявление свойств в главном конструкторе ...................................................... 245
Вспомогательные конструкторы........................................................................... 246
Аргументы по умолчанию .................................................................................... 248
Именованные аргументы ..................................................................................... 249
Блок инициализации ........................................................................................... 250
Инициализация свойств....................................................................................... 251
Порядок инициализации...................................................................................... 254
Задержка инициализации.................................................................................... 256
Поздняя инициализация ...................................................................................... 256
Оглавление   11
Отложенная инициализация ............................................................................... 258
Для любопытных: подводные камни инициализации ........................................... 259
Задание: загадка Экскалибура............................................................................. 262
Глава 14. Наследование.......................................................................................... 264
Объявление класса Room .................................................................................... 264
Создание подкласса ............................................................................................ 265
Проверка типов ................................................................................................... 273
Иерархия типов в языке Kotlin ............................................................................. 275
Приведение типа................................................................................................. 276
Умное приведение типа....................................................................................... 278
Для любопытных: Any ......................................................................................... 279
Глава 15. Объекты .................................................................................................. 281
Ключевое слово object......................................................................................... 281
Объявления объектов.......................................................................................... 282
Анонимные объекты ............................................................................................ 288
Вспомогательные объекты................................................................................... 288
Вложенные классы .............................................................................................. 289
Классы данных .................................................................................................... 293
toString........................................................................................................... 294
equals............................................................................................................. 295
copy ............................................................................................................... 295
Деструктуризация объявлений ....................................................................... 296
Перечисления...................................................................................................... 297
Перегрузка операторов ....................................................................................... 299
Исследуем мир NyetHack...................................................................................... 301
Для любопытных: объявление структурного сравнения....................................... 305
Для любопытных: алгебраические типы данных.................................................. 307
Задание: команда «Quit» ..................................................................................... 310
Задание: реализация карты мира ........................................................................ 310
Задание: позвонить в колокол............................................................................. 311
12 Оглавление
Глава 16. Интерфейсы и абстрактные классы.......................................................... 312
Объявление интерфейса...................................................................................... 312
Реализация интерфейса ...................................................................................... 313
Реализация по умолчанию................................................................................... 317
Абстрактные классы ............................................................................................ 317
Сражение в NyetHack........................................................................................... 320
Глава 17. Обобщения.............................................................................................. 326
Объявление обобщенных типов........................................................................... 326
Обобщенные функции ......................................................................................... 328
Несколько параметров
обобщенного типа ............................................................................................... 330
Ограничения обобщений ..................................................................................... 332
vararg и get.......................................................................................................... 333
in и out................................................................................................................ 336
Для любопытных: ключевое слово reified ............................................................ 341
Глава 18. Расширения............................................................................................. 343
Объявление функции-расширения....................................................................... 343
Объявление расширения для суперкласса ........................................................... 345
Обобщенные функции-расширения ..................................................................... 345
Свойства-расширения.......................................................................................... 348
Расширения для типов с поддержкой null ............................................................ 349
Расширения: работа изнутри ............................................................................... 350
Извлечение в расширения ................................................................................... 351
Объявление файла-расширения .......................................................................... 352
Переименование расширения.............................................................................. 355
Расширения в стандартной библиотеке Kotlin ...................................................... 355
Для любопытных: анонимные функции с приемниками ....................................... 357
Задание: расширение toDragonSpeak................................................................... 358
Задание: расширение рамок................................................................................ 358
Оглавление   13
Глава 19. Основы функционального программирования.......................................... 360
Категории функций ............................................................................................. 360
Преобразователи ........................................................................................... 361
Фильтры.............................................................................................................. 363
Комбинаторы....................................................................................................... 365
Почему именно функциональное программирование? ......................................... 366
Последовательности............................................................................................ 367
Для любопытных: профилирование..................................................................... 370
Для любопытных: Arrow.kt................................................................................... 370
Задание: переворачиваем значения в ассоциативном массиве ............................ 372
Задание: применяем функциональное программирование к Tavern.kt ................. 372
Задание: скользящее окно................................................................................... 373
Глава 20. Совместимость с Java .............................................................................. 375
Совместимость с классом Java ............................................................................ 375
Совместимость и null ........................................................................................... 377
Соответствие типов ............................................................................................. 380
Методы свойств и совместимость ....................................................................... 382
За пределами класса ........................................................................................... 384
Исключения и совместимость .............................................................................. 394
Функциональные типы в Java .............................................................................. 397
Глава 21. Ваше первое Android-приложение на Kotlin.............................................. 400
Android Studio...................................................................................................... 400
Настройка Gradle ................................................................................................. 405
Организация проекта .......................................................................................... 408
Определение UI................................................................................................... 408
Запуск приложения на эмуляторе........................................................................ 411
Создание персонажа ........................................................................................... 412
Класс Activity ....................................................................................................... 414
Связывание визуальных элементов ..................................................................... 415
14 Оглавление
Расширения Kotlin для Android: синтетические свойства ...................................... 418
Настройка обработчика щелчков......................................................................... 420
Сохранение состояния экземпляра ...................................................................... 421
Чтение сохраненного состояния экземпляра........................................................ 424
Преобразование в расширение............................................................................ 425
Для любопытных: библиотеки Android KTX и Anko............................................... 427
Глава 22. Знакомство с сопрограммами .................................................................. 430
Парсинг характеристик персонажа ...................................................................... 430
Извлечение оперативных данных ........................................................................ 432
Главный поток выполнения в Android .................................................................. 436
Включение сопрограмм ....................................................................................... 437
Определение сопрограммы с помощью async....................................................... 437
launch против async/await.................................................................................... 439
Функция приостановки ........................................................................................ 440
Задание: оперативные данные ............................................................................ 441
Задание: минимальная сила ................................................................................ 441
Глава 23. Послесловие............................................................................................ 442
А что дальше? ..................................................................................................... 442
Наглая самореклама............................................................................................ 442
Спасибо вам ....................................................................................................... 443
Приложение ...................................................................................................... 444
Еще задания........................................................................................................ 444
Прокачиваем навыки с Exercism........................................................................... 444
Глоссарий ......................................................................................................... 451