Kotlin — это язык программирования со статической типизацией, который взяла на вооружение Google в ОС Android. Кроме того, это мультиплатформенный язык, позволяющий создавать приложения для macOS, Windows и iOS. Джош Скин, Дэвид Гринхол, Эндрю Бэйли на практических примерах познакомят вас с ключевыми концепциями Kotlin и фундаментальными API.
Вы начнете с основных принципов и перейдете к расширенному использованию нетривиальных возможностей Kotlin, чтобы создавать надежные и эффективные приложения, а так же освоите среду разработки IntelliJ IDEA от JetBrains.
Author(s): Джош Скин, Дэвид Гринхол, Эндрю Бэйли
Series: Для профессионалов
Edition: 2
Publisher: Питер
Year: 2023
Language: Russian
Pages: 560
City: СПб.
Оглавление
Благодарности
Представляем Kotlin
Почему Kotlin?
Для кого написана эта книга
Как пользоваться этой книгой
Для любознательных
Задания
Шрифтовые обозначения
Заглядывая вперед
От издательства
Часть I. Первые шаги
1. Ваше первое приложение на Kotlin
Установка IntelliJ IDEA
Ваш первый проект на Kotlin
Ваш первый файл на Kotlin
Запуск вашего файла на языке Kotlin
Компиляция и выполнение кода Kotlin/JVM
Kotlin REPL
Для любознательных: зачем использовать IntelliJ
Для любознательных: программирование для JVM
Задание: арифметические вычисления в REPL
2. Переменные, константы и типы
Типы
Объявление переменной
Встроенные типы языка Kotlin
Переменные, доступные только для чтения
Автоматическое определение типов
Константы времени компиляции
Изучаем байт-код Kotlin
Для любознательных: простые типы Java в Kotlin
Задание: hasSteed
Задание: «Рог единорога»
Задание: волшебное зеркало
Часть II. Базовый синтаксис
3. Условные конструкции
Операторы if/else
Добавление условий
Вложенные команды if/else
Более элегантные условные выражения
Логические операторы
Условные выражения
Убираем скобки в выражениях if/else
Интервалы
Условное выражение when
Выражения when c объявлением переменных
Выражения when без аргументов
Задание: эксперименты с интервалами
4. Функции
Выделение кода в функции
Анатомия функции
Заголовок функции
Модификатор видимости
Объявление имени функции
Параметры функции
Тип возвращаемого значения
Тело функции
Область видимости функции
Вызов функции
Пишем свои функции
Аргументы по умолчанию
Функции с единственным выражением
Функции с возвращаемым типом Unit
Именованные аргументы функций
Для любознательных: тип Nothing
Для любознательных: функции уровня файла в Java
Для любознательных: перегрузка функций
Для любознательных: имена функций в обратных кавычках
5. Числа
Числовые типы
Целые числа
Дробные числа
Форматирование значений типа Double
Преобразования числовых типов
Для любознательных: числа без знака
Для любознательных: манипуляции с битами
6. Строки
Интерполяция строк
Необработанные строки
Чтение ввода с консоли
Преобразование строк в числа
Регулярные выражения
Операции со строками
Строки неизменяемы
Сравнение строк
Для любознательных: Юникод
7. Null-безопасность и исключения
Допустимость null
Явный тип null в Kotlin
Время компиляции и время выполнения
Null-безопасность
Первый вариант: проверка null в операторе if
Второй вариант: оператор безопасного вызова
Использование безопасного вызова с let
Оператор объединения с null
Третий вариант: оператор проверки
Исключения
Выдача исключений
Обработка исключений
Выражения try/catch
Проверка предусловий
Для любознательных: пользовательские исключения
Для любознательных: проверяемые и непроверяемые исключения
Часть III. Функциональное программирование и коллекции
8. Лямбда-выражения и тип функции
Представляем NyetHack
Анонимные функции
Лямбда-выражения
Тип функции
Неявный возврат
Аргументы функции
Идентификатор it
Получение нескольких аргументов
Поддержка автоматического определения типов
Более эффективные лямбда-выражения
Определение функции, которая получает функцию
Сокращенный лямбда-синтаксис
Встраиваемые функции
Лямбда-выражения и стандартная библиотека Kotlin
Для любознательных: ссылки на функции
Для любознательных: захват лямбда-выражений
Задание: новые титулы и настроения
9. Списки и множества
Списки
Обращение к элементам списка
Границы индексов и безопасные обращения по индексу
Проверка содержимого списка
Изменение содержимого списка
Итерация
Чтение файла в список
Деструктуризация
Множества
Создание множества
Добавление элементов в множество
Цикл while
Преобразование коллекций
Для любознательных: типы массивов
Для любознательных: «только для чтения» vs «неизменяемый»
Для любознательных: выражение break
Для любознательных: метки return
Задание: форматированный вывод меню таверны
Задание: улучшенное форматирование меню таверны
10. Ассоциативные массивы
Создание ассоциативного массива
Доступ к значениям в ассоциативном массиве
Добавление записей в ассоциативный массив
Изменение значений в ассоциативном массиве
Преобразования между списками и ассоциативными массивами
Перебор элементов ассоциативного массива
Задание: составные заказы
11. Основы функционального программирования
Преобразование данных
map
associate
Деструктуризация средствами функционального программирования
flatMap
map vs flatMap
Фильтрация данных
filter
Комбинирование данных
zip
Почему именно функциональное программирование?
Последовательности
Для любознательных: профилирование
Для любознательных: агрегирование данных
reduce
fold
sumBy
Для любознательных: ключевое слово vararg
Для любознательных: Arrow.kt
Задание: перестановка ключей и значений в ассоциативном массиве
Задание: поиск самого популярного пункта меню
12. Функции области видимости
apply
let
run
with
also
takeIf
Использование функций области видимости
Часть IV. Объектно-ориентированное программирование
13. Классы
Объявление класса
Создание экземпляров
Функции класса
Видимость и инкапсуляция
Свойства класса
Get-методы и set-методы свойств
Видимость свойств
Вычисляемые свойства
Использование пакетов
Для любознательных: более пристальный взгляд на свойства var и val
Для любознательных: защита от изменяемости
Для любознательных: ограничение видимости рамками пакета
14. Инициализация
Конструкторы
Главный конструктор
Объявление свойств в главном конструкторе
Дополнительные конструкторы
Аргументы по умолчанию
Именованные аргументы
Блок инициализации
Порядок инициализации
Задержка инициализации
Поздняя инициализация
Отложенная инициализация
Для любознательных: подводные камни инициализации
Для любознательных: делегаты свойств
Задание: загадка Экскалибура
15. Наследование
Объявление класса Room
Создание подкласса
Проверка типов
Иерархия типов в языке Kotlin
Приведение типа
Умное приведение типа
Рефакторинг кода таверны
Для любознательных: Any
Для любознательных: оператор безопасного приведения типа
16. Объекты, классы данных и перечисления
Ключевое слово object
Объявления объекта
Объекты-выражения
Объекты-компаньоны
Вложенные классы
Классы данных
toString
equals и hashCode
copy
Деструктуризация объявлений
Классы-перечисления
Перегрузка операторов
Исследуем мир NyetHack
Для любознательных: объявление структурного сравнения
Для любознательных: алгебраические типы данных
Для любознательных: классы-значения
Задание: другие команды
Задание: реализация карты мира
Задание: колокольный звон
17. Интерфейсы и абстрактные классы
Определение интерфейса
Реализация интерфейса
Реализация по умолчанию
Абстрактные классы
Сражение в NyetHack
Задание: дополнительные монстры
Часть V. Kotlin для опытных программистов
18. Обобщения
Определение обобщенных типов
Обобщенные функции
Ограничения обобщений
in и out
Добавление наград в NyetHack
Для любознательных: ключевое слово reified
19. Расширения
Определение функции-расширения
Объявление расширения для суперкласса
Обобщенные функции-расширения
Операторные функции-расширения
Свойства-расширения
Расширения для типов, допускающих null
Расширения: как это устроено
Видимость расширений
Расширения в стандартной библиотеке Kotlin
Для любознательных: литералы функций с получателями
Задание: расширение рамок
20. Сопрограммы
Блокирующие вызовы
Включение сопрограмм
Строители сопрограмм
Области видимости сопрограмм
Структурированный параллелизм
Использование клиента HTTP
async и await
Для любознательных: состояние гонки
Для любознательных: Kotlin на стороне сервера
Задание: никаких отмен
21. Потоки данных
Создание потоков данных
MutableStateFlow
Завершение потоков данных
Преобразования потоков данных
Обработка ошибок в потоках данных
Для любознательных: SharedFlow
22. Каналы
Распределение работы с использованием каналов
Отправка данных в канал
Получение данных из канала
Закрытие канала
Объединение заданий
Для любознательных: другие особенности поведения каналов
Встречные каналы (rendezvous)
Буферизованные каналы (buffered)
Неограниченные каналы (unlimited)
Каналы с заменой (conflated)
Часть VI. Совместимость и мультиплатформенные приложения
23. Совместимость с Java
Взаимодействие с классом Java
Совместимость и null
Соответствие типов
Get-методы, set-методы и совместимость
За пределами класса
Исключения и совместимость
Функциональные типы в Java
24. Знакомство с Kotlin Multiplatform
Что такое Kotlin Multiplatform?
Планирование мультиплатформенного проекта
Первый мультиплатформенный проект
Определение целевой платформы Kotlin/JVM
Определение общего кода
expect и actual
25. Kotlin/Native
Объявление целевой платформы macOS
Написание нативного кода на Kotlin
Запуск приложения Kotlin/Native
Вывод Kotlin/Native
Для любознательных: Kotlin Multiplatform Mobile
Для любознательных: другие нативные платформы
26. Kotlin/JS
Объявление поддержки Kotlin/JS
Взаимодействие с DOM
Ключевое слово external
Выполнение произвольного кода JavaScript
Динамические типы
Для любознательных: фреймворки клиентской части
Задание: комиссионные при обмене валюты
Послесловие
Что дальше?
Бесстыдная самореклама
Спасибо вам
Глоссарий