2-е изд. — СПб.: Питер, 2022. — 560 с.: ил. — (Для профессионалов). — ISBN 978-5-4461-2319-3.
Kotlin — язык программирования со статической типизацией, который взяла на вооружение Google в ОС Android.
В 2011 году компания JetBrains анонсировала альтернативу языкам Java и Scala - язык программирования Kotlin, код которого тоже выполняется под управлением виртуальной машины Java (Java Virtual Machine). Шесть лет спустя Google объявил об официальной поддержке Kotlin как языка разработки для операционной системы Android. И Kotlin быстро превратился из просто «перспективного» в язык поддержки приложений для лидирующей мобильной операционной системы. Сегодня крупные компании вроде Google, Uber, Netflix, Capital One, Amazon и других официально приняли на вооружение Kotlin, чему способствовали его компактность, современные возможности и полная совместимость с Java.
Почему Kotlin? Чтобы оценить привлекательность Kotlin, стоит сначала разобраться, какое место в современном мире разработки ПО занимает Java. Код на Kotlin выполняется под управлением Java Virtual Machine, поэтому эти два языка тесно взаимосвязаны. Java — надежный и проверенный язык, чаще других используемый для разработки промышленных приложений на протяжении многих лет. Но он был создан в далеком 1995 году, и с того времени критерии оценки хорошего языка программирования изменились. В Java отсутствуют многие удобные опции, которые есть у современных языков. Создатели Kotlin учли недостатки проектных решений, принятых при разработке Java (и других языков, например Scala). Они расширили возможности языка и исправили в нем многое, что доставляло массу неудобств в языках, разработанных ранее. Из этой книги вы узнаете, чем Kotlin лучше Java и почему работать с ним удобнее.
Kotlin — это не просто улучшенный язык для виртуальной машины Java. Это мультиплатформенный язык общего назначения: на Kotlin можно писать нативные приложения для macOS, Windows и iOS, приложения на JavaScript и, конечно, приложения для Android. В последнее время компания JetBrains прилагает значительные усилия для разработки кросс-платформенных возможностей; Kotlin Multiplatform предоставляет уникальную возможность совместного использования кода разными приложениями, что привело к росту популярности Kotlin за пределами виртуальной машины Java.
Для кого написана эта книга:Мы написали эту книгу для разработчиков разного уровня: тех, кто имеет богатый опыт создания приложений для Android и кому не хватает возможностей Java; тех, кто разрабатывает серверный код и заинтересован в возможностях Kotlin; тех, кто стремится к совместному использованию кода Kotlin в нативных и веб-приложениях; а также для новичков, решившихся на самостоятельное изучение высокопроизводительного компилируемого языка. Поддержка Android может стать мотивом для изучения Kotlin, но наша книга не ограничивается рассказом о программировании для Android. Более того, весь код в книге не зависит от фреймворка Android. Тем не менее, если вас интересует именно использование Kotlin для разработки Android-приложений, здесь вы найдете основные приемы, которые упростят процесс написания приложений для Android на Kotlin.
Благодарности
Представляем Kotlin
Почему Kotlin
Для кого написана эта книга
Как пользоваться этой книгой
Для любознательных
Задания
Шрифтовые обозначения
Заглядывая вперед
От издательства
ПЕРВЫЕ ШАГИВаше первое приложение на KotlinУстановка IntellU IDEA
Ваш первый проект на Kotlin
Ваш первый файл на Kotlin
Запуск вашего файла на языке Kotlin
Компиляция и выполнение кода Kotlin/JVM
Kotlin REPL
Для любознательных: зачем использовать IntellU
Для любознательных: программирование для JVM
Задание: арифметические вычисления в REPL
Переменные, константы и типыТипы
Объявление переменной
Встроенные типы языка Kotlin
Переменные, доступные только для чтения
Автоматическое определение типов
Константы времени компиляции
Изучаем байт-код Kotlin
Для любознательных: простые типы Java в Kotlin
Задание: hasSteed
Задание: «Рог единорога
Задание: волшебное зеркало
БАЗОВЫЙ СИНТАКСИСУсловные конструкцииОператоры if/else
Добавление условий
Вложенные команды if/else
Более элегантные условные выражения
Логические операторы
Условные выражения
Убираем скобки в выражениях if/else
Интервалы
Условное выражение when
Выражения when с объявлением переменных
Выражения when без аргументов
Задание: эксперименты с интервалами
ФункцииВыделение кода в функции
Анатомия функции
Заголовок функции
Модификатор видимости
Объявление имени функции
Параметры функции
Тип возвращаемого значения
Тело функции
Область видимости функции
Вызов функции
Пишем свои функции
Аргументы по умолчанию
Функции с единственным выражением
Функции с возвращаемым типом Unit
Именованные аргументы функций
Для любознательных: тип Nothing
Для любознательных: функции уровня файла в Java
Для любознательных: перегрузка функций
Для любознательных: имена функций в обратных кавычках
ЧислаЧисловые типы
Целые числа...НО
Дробные числа
Форматирование значений типа Double
Преобразования числовых типов
Для любознательных: числа без знака
Для любознательных: манипуляции с битами
СтрокиИнтерполяция строк
Необработанные строки
Чтение ввода с консоли
Преобразование строк в числа
Регулярные выражения
Операции со строками
Строки неизменяемы
Сравнение арок
Для любознательных: Юникод
Null-безопасноаь и исключенияДопуаимоаь null
Явный тип null в Kotlin
Время компиляции и время выполнения
Null-безопасность
Первый вариант: проверка null в операторе if
Второй вариант: оператор безопасного вызова
Использование безопасного вызова с let
Оператор объединения с null
Третий вариант: оператор проверки
Исключения
Выдача исключений
Обработка исключений
Выражения try/catch
Проверка предусловий
Для любознательных: пользовательские исключения
Для любознательных: проверяемые и непроверяемые исключения
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ И КОЛЛЕКЦИИЛямбда-выражения и тип функцииПредставляем NyetHack
Анонимные функции
Лямбда-выражения
Тип функции
Неявный возврат
Аргументы функции
Идентификатор it
Получение нескольких аргументов
Поддержка автоматического определения типов
более эффективные лямбда-выражения
Определение функции, которая получает функцию
Сокращенный лямбда-синтаксис
Встраиваемые функции
Лямбда-выражения и стандартная библиотека Kotlin
Для любознательных: ссылки на функции
Для любознательных: захват лямбда-выражений
Задание: новые титулы и настроения
Списки и множестваСписки
Обращение к элементам списка
Границы индексов и безопасные обращения по индексу
Проверка содержимого списка
Изменение содержимого списка
Итерация
Чтение файла в список
Деструктуризация
Множества
Создание множества
Добавление элементов в множество
Цикл while
Преобразование коллекций
Для любознательных: типы массивов
Для любознательных: «только для чтения» vs «неизменяемый
Для любознательных: выражение break
Для любознательных: метки return
Задание: форматированный вывод меню таверны
Задание: улучшенное форматирование меню таверны
Ассоциативные массивыСоздание ассоциативного массива
Доступ к значениям в ассоциативном массиве
Добавление записей в ассоциативный массив
Изменение значений в ассоциативном массиве
Преобразования между списками и ассоциативными массивами
Перебор элементов ассоциативного массива
Задание: составные заказы
Основы функционального программированияПреобразование данных
тар
associate
Деструктуризация средствами функционального программирования
flatMap
map vs flatMap
Фильтрация данных
filter
Комбинирование данных
ZIP
Почему именно функциональное программирование
Последовательности
Для любознательных: профилирование
Для любознательных: агрегирование данных
reduce
fold
sumBy
Для любознательных: ключевое слово vararg
Для любознательных: Arrow.kt
Задание: перестановка ключей и значений в ассоциативном массиве
Задание: поиск самого популярного пункта меню
Функции области видимостиapply
let
run
with
also
takelf
Использование функций области видимости
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕКлассыОбъявление класса
Создание экземпляров
Функции класса
Видимость и инкапсуляция
Свойства класса
Get-методы и set-методы свойств
Видимость свойств
Вычисляемые свойства
Использование пакетов
Для любознательных: более пристальный взгляд на свойства ѵаг и ѵа
Для любознательных: защита от изменяемости
Для любознательных: ограничение видимости рамками пакета
ИнициализацияКонструкторы
Главный конструктор
Объявление свойств в главном конструкторе
Дополнительные конструкторы
Аргументы по умолчанию
Именованные аргументы
Блок инициализации
Порядок инициализации
Задержка инициализации
Поздняя инициализация
Отложенная инициализация
Для любознательных: подводные камни инициализации
Для любознательных: делегаты свойств
Задание: загадка Экскалибура
НаследованиеОбъявление класса Room
Создание подкласса
Проверка типов
Иерархия типов в языке КоОіп
Приведение типа
Умное приведение типа
Рефакторинг кода таверны
Для любознательных: Any
Для любознательных: оператор безопасного приведения типа
Объекты, классы данных и перечисленияКлючевое слово object
Объявления объекта
Объекты-выражения
Объекты-компаньоны
Вложенные классы
Классы данных
toString
equals и hashCode
copy
Деструктуризация объявлений
Классы-перечисления
Перегрузка операторов
Исследуем мир NyetHack
Для любознательных: объявление структурного сравнения
Для любознательных: алгебраические типы данных
Для любознательных: классы-значения
Задание: другие команды
Задание: реализация карты мира
Задание: колокольный звон
Интерфейсы и абстрактные классыОпределение интерфейса
Реализация интерфейса
Реализация по умолчанию
Абстрактные классы
Сражение в NyetHack
Задание: дополнительные монстры
KOTLIN ДЛЯ ОПЫТНЫХ ПРОГРАММИСТОВОбобщенияОпределение обобщенных типов
Обобщенные функции
Ограничения обобщений
in и out
Добавление наград в NyetHack
Для любознательных: ключевое слово reified
РасширенияОпределение функции-расширения
Объявление расширения для суперкласса
Обобщенные функции-расширения
Операторные функции-расширения
Свойства-расширения
Расширения для типов, допускающих null
Расширения: как это устроено
Видимость расширений
Расширения в стандартной библиотеке Kotlin
Для любознательных: литералы функций с получателями
Задание: расширение рамок
СопрограммыБлокирующие вызовы
Включение сопрограмм
Строители сопрограмм
Области видимости сопрограмм
Структурированный параллелизм
Использование клиента HTTP
async и await
Для любознательных: состояние гонки
Для любознательных: Kotlin на стороне сервера
Задание: никаких отмен
Потоки данныхСоздание потоков данных
MutableStateFlow
Завершение потоков данных
Преобразования потоков данных
Обработка ошибок в потоках данных
Для любознательных: SharedFlow
КаналыРаспределение работы с использованием каналов
Отправка данных в канал
Получение данных из канала
Закрытие канала
Объединение заданий
Для любознательных: другие особенности поведения каналов
Встречные каналы (rendezvous)
Буферизованные каналы (buffered)
Неограниченные каналы (unlimited)
Каналы с заменой (conflated)
СОВМЕСТИМОСТЬ И МУЛЬТИПЛАТФОРМЕННЫЕ ПРИЛОЖЕНИЯСовместимость с JavaВзаимодействие с классом Java
Совместимость и null