Благодарности....5
Представляем Kotlin....8
Почему Kotlin?....8
Для кого написана эта книга....9
Как пользоваться этой книгой....10
Шрифтовые обозначения....12
Заглядывая вперед....13
От издательства....13
Часть I. Первые шаги....15
1. Ваше первое приложение на Kotlin....16
Установка IntelliJ IDEA....16
Ваш первый проект на Kotlin....17
Ваш первый файл на Kotlin....26
Запуск вашего файла на языке Kotlin....29
Kotlin REPL....31
Для любознательных: зачем использовать IntelliJ....34
Для любознательных: программирование для JVM....35
Задание: арифметические вычисления в REPL....36
2. Переменные, константы и типы....38
Типы....38
Объявление переменной....39
Встроенные типы языка Kotlin....44
Переменные, доступные только для чтения....46
Автоматическое определение типов....51
Константы времени компиляции....54
Изучаем байт-код Kotlin....57
Для любознательных: простые типы Java в Kotlin....61
Задание: hasSteed....63
Задание: «Рог единорога»....64
Задание: волшебное зеркало....65
Часть II. Базовый синтаксис....67
3. Условные конструкции....68
Операторы if/else....68
Добавление условий....75
Вложенные операторы if/else....79
Более элегантные условные выражения....82
Интервалы....98
Условное выражение when....101
Выражения when c объявлением переменных....106
Задание: эксперименты с интервалами....109
4. Функции....111
Выделение кода в функции....111
Анатомия функции....116
Вызов функции....125
Пишем свои функции....128
Аргументы по умолчанию....132
Функции с единственным выражением....135
Функции с возвращаемым типом Unit....140
Именованные аргументы функций....142
Для любознательных: тип Nothing....146
Для любознательных: функции уровня файла в Java....149
Для любознательных: перегрузка функций....151
Для любознательных: имена функций в обратных кавычках....154
5. Числа....157
Числовые типы....157
Целые числа....160
Дробные числа....162
Форматирование значений типа Double....166
Преобразования числовых типов....170
Для любознательных: числа без знака....172
Для любознательных: манипуляции с битами....177
6. Строки....180
Интерполяция строк....180
Необработанные строки....187
Чтение ввода с консоли....190
Преобразование строк в числа....192
Регулярные выражения....197
Операции со строками....200
Сравнение строк....203
Для любознательных: Юникод....206
7. Null-безопасность и исключения....208
Допустимость null....208
Явный тип null в Kotlin....213
Время компиляции и время выполнения....218
Null-безопасность....219
Первый вариант: проверка null в операторе if....221
Второй вариант: оператор безопасного вызова....224
Третий вариант: оператор проверки....234
Исключения....237
Для любознательных: пользовательские исключения....251
Для любознательных: проверяемые и непроверяемые исключения....254
Часть III. Функциональное программирование и коллекции....256
8. Лямбда-выражения и тип функции....258
Представляем NyetHack....258
Анонимные функции....260
Лямбда-выражения....262
Неявный возврат....267
Поддержка автоматического определения типов....273
Более эффективные лямбда-выражения....275
Определение функции, которая получает функцию....281
Встраиваемые функции....286
Лямбда-выражения и стандартная библиотека Kotlin....289
Для любознательных: ссылки на функции....294
Для любознательных: захват лямбда-выражений....296
Задание: новые титулы и настроения....298
9. Списки и множества....301
Списки....305
Итерация....321
Чтение файла в список....329
Деструктуризация....332
Множества....337
Цикл while....345
Преобразование коллекций....348
Для любознательных: типы массивов....350
Для любознательных: «только для чтения» vs «неизменяемый»....352
Для любознательных: выражение break....354
Для любознательных: метки return....356
Задание: форматированный вывод меню таверны....359
Задание: улучшенное форматирование меню таверны....359
10. Ассоциативные массивы....361
Создание ассоциативного массива....361
Доступ к значениям в ассоциативном массиве....365
Добавление записей в ассоциативный массив....368
Изменение значений в ассоциативном массиве....372
Преобразования между списками и ассоциативными массивами....376
Перебор элементов ассоциативного массива....382
Задание: составные заказы....388
11. Основы функционального программирования....390
Преобразование данных....391
Фильтрация данных....408
Комбинирование данных....412
Почему именно функциональное программирование?....416
Последовательности....419
Для любознательных: профилирование....423
Для любознательных: агрегирование данных....424
Для любознательных: ключевое слово vararg....428
Для любознательных: Arrow.kt....430
Задание: перестановка ключей и значений в ассоциативном массиве....432
Задание: поиск самого популярного пункта меню....433
12. Функции области видимости....434
apply....434
let....436
run....440
with....441
also....442
takeIf....443
Часть IV. Объектно-ориентированное программирование....450
13. Классы....451
Объявление класса....451
Создание экземпляров....452
Функции класса....453
Видимость и инкапсуляция....455
Свойства класса....458
Get-методы и set-методы свойств....462
Видимость свойств....468
Вычисляемые свойства....470
Использование пакетов....475
Для любознательных: более пристальный взгляд на свойства var и val....478
Для любознательных: защита от изменяемости....484
Для любознательных: ограничение видимости рамками пакета....487
14. Инициализация....489
Конструкторы....490
Главный конструктор....491
Объявление свойств в главном конструкторе....495
Дополнительные конструкторы....496
Аргументы по умолчанию....500
Именованные аргументы....503
Блок инициализации....505
Порядок инициализации....508
Задержка инициализации....510
Для любознательных: подводные камни инициализации....525
Для любознательных: делегаты свойств....529
Задание: загадка Экскалибура....530
15. Наследование....533
Объявление класса Room....533
Создание подкласса....537
Проверка типов....548
Иерархия типов в языке Kotlin....552
Приведение типа....553
Умное приведение типа....556
Рефакторинг кода таверны....558
Для любознательных: Any....576
Для любознательных: оператор безопасного приведения типа....578
16. Объекты, классы данных и перечисления....580
Ключевое слово object....580
Классы данных....601
Перегрузка операторов....613
Исследуем мир NyetHack....617
Для любознательных: объявление структурного сравнения....624
Для любознательных: алгебраические типы данных....627
Для любознательных: классы-значения....632
Задание: другие команды....634
Задание: реализация карты мира....634
Задание: колокольный звон....635
17. Интерфейсы и абстрактные классы....636
Определение интерфейса....636
Реализация интерфейса....638
Реализация по умолчанию....644
Абстрактные классы....645
Сражение в NyetHack....652
Задание: дополнительные монстры....660
Часть V. Kotlin для опытных программистов....662
18. Обобщения....663
Определение обобщенных типов....663
Обобщенные функции....667
Ограничения обобщений....670
in и out....675
Добавление наград в NyetHack....682
Для любознательных: ключевое слово reified....696
19. Расширения....699
Определение функции-расширения....699
Объявление расширения для суперкласса....704
Обобщенные функции-расширения....705
Свойства-расширения....712
Расширения для типов, допускающих null....716
Расширения: как это устроено....718
Видимость расширений....721
Расширения в стандартной библиотеке Kotlin....722
Для любознательных: литералы функций с получателями....724
Задание: расширение рамок....727
20. Сопрограммы....729
Блокирующие вызовы....731
Включение сопрограмм....735
Строители сопрограмм....737
Области видимости сопрограмм....739
Структурированный параллелизм....741
Использование клиента HTTP....746
async и await....757
Для любознательных: состояние гонки....762
Для любознательных: Kotlin на стороне сервера....767
Задание: никаких отмен....769
21. Потоки данных....770
Создание потоков данных....771
MutableStateFlow....787
Завершение потоков данных....796
Преобразования потоков данных....801
Обработка ошибок в потоках данных....805
Для любознательных: SharedFlow....810
22. Каналы....817
Распределение работы с использованием каналов....818
Отправка данных в канал....820
Получение данных из канала....821
Закрытие канала....829
Объединение заданий....831
Для любознательных: другие особенности поведения каналов....839
Часть VI. Совместимость и мультиплатформенные приложения....844
23. Совместимость с Java....845
Взаимодействие с классом Java....846
Совместимость и null....849
Соответствие типов....854
Get-методы, set-методы и совместимость....858
За пределами класса....861
Исключения и совместимость....878
24. Знакомство с Kotlin Multiplatform....888
Что такое Kotlin Multiplatform?....889
Планирование мультиплатформенного проекта....891
Первый мультиплатформенный проект....893
Определение целевой платформы Kotlin/JVM....895
Определение общего кода....898
expect и actual....901
25. Kotlin/Native....912
Написание нативного кода на Kotlin....917
Для любознательных: Kotlin Multiplatform Mobile....928
Для любознательных: другие нативные платформы....930
26. Kotlin/JS....934
Объявление поддержки Kotlin/JS....934
Взаимодействие с DOM....942
Для любознательных: фреймворки клиентской части....964
Задание: комиссионные при обмене валюты....965
Послесловие....967
Что дальше?....967
Глоссарий....969
Рекомендуем прочитать....984
В 2011 году компания JetBrains анонсировала альтернативу языкам Java и Scala —язык программирования Kotlin, код которого тоже выполняется под управлением виртуальной машины Java (Java Virtual Machine). Шесть лет спустя Google объявил об официальной поддержке Kotlin как языка разработки для операционной системы Android.
И Kotlin быстро превратился из просто «перспективного» в язык поддержки приложений для лидирующей мобильной операционной системы. Сегодня крупные компании вроде Google, Uber, Netflix, Capital One, Amazon и других официально приняли на вооружение Kotlin, чему способствовали его компактность, современные возможности и полная совместимость с Java.