Файл: Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 721
Скачиваний: 11
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
2022
Scala
Профессиональное программирование
Мартин Одерски
Лекс Спун
Билл Веннерс
Фрэнк Соммерс
5-е издание
ББК 32.973.2-018.1
УДК 004.43
О-41
Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс Фрэнк
О-41 Scala. Профессиональное программирование. 5-е изд.. — СПб.: Питер,
2022. — 608 с.: ил. — (Серия «Библиотека программиста»).
ISBN 978-5-4461-1914-1
«Scala. Профессиональное программирование» — главная книга по Scala, популярному языку для платформы Java, в котором сочетаются концепции объектно-ориентированного и функционального программирования, благодаря чему он превращается в уникальное и мощное средство разработки.
Этот авторитетный труд, написанный создателями Scala, поможет вам пошагово изучить язык и идеи, лежащие в его основе.
Пятое издание значительно обновлено, чтобы охватить многочисленные изменения, по- явившиеся в Scala 3.
16+
(В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.)
ББК 32.973.2-018.1
УДК 004.43
Права на издание получены по соглашению с Artima Inc. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения вла- дельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, изда- тельство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. Издательство не несет от- ветственности за доступность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими.
ISBN 978-0997148008 англ.
© 2019 Martin Odersky, Lex Spoon, Bill Venners, Frank Sommers.
All rights reserved
ISBN 978-5-4461-1914-1
© Перевод на русский язык ООО «Прогресс книга», 2022
© Издание на русском языке, оформление ООО «Прогресс книга»,
2022
© Серия «Библиотека программиста», 2022
© Павлов А., перевод с английского языка, 2022
Краткое содержание
Отзывы на предыдущие издания книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Глава 1. Масштабируемый язык . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Глава 2. Первые шаги в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Глава 3. Дальнейшие шаги в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Глава 4. Классы и объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Глава 5. Основные типы и операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Глава 6. Функциональные объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Глава 7. Встроенные управляющие конструкции . . . . . . . . . . . . . . . . . . . . 145
Глава 8. Функции и замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Глава 9. Управляющие абстракции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Глава 10. Композиция и наследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Глава 11. Трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Глава 12. Пакеты, импорты и экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Глава 13. Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Глава 14. Работа со списками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Глава 15. Работа с другими коллекциями . . . . . . . . . . . . . . . . . . . . . . . . . 331
6 Краткое содержание
Глава 16. Изменяемые объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Глава 17. Иерархия Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Глава 18. Параметризация типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Глава 19. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Глава 20. Абстрактные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Глава 21. Гивены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Глава 22. Методы расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Глава 23. Классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Глава 24. Углубленное изучение коллекций . . . . . . . . . . . . . . . . . . . . . . . . 511
Глава 25. Утверждения и тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Оглавление
Отзывы на предыдущие издания книги . . . . . . . . . . . . . . . . . . . . . . . . 18
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Целевая аудитория . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Как пользоваться книгой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Как изучать Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Условные обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Ресурсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Исходный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Глава 1. Масштабируемый язык . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1 .1 . Язык, который растет вместе с вами . . . . . . . . . . . . . . . . . . . . . . . . . 38
Растут новые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Растут новые управляющие конструкции . . . . . . . . . . . . . . . . . . . 41 1 .2 . Почему язык Scala масштабируемый? . . . . . . . . . . . . . . . . . . . . . . . . . 41
Scala — объектно-ориентированный язык . . . . . . . . . . . . . . . . . . . 42
Scala — функциональный язык . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 1 .3 . Почему именно Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Scala — совместимый язык . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Scala — лаконичный язык . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Scala — высокоуровневый язык . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Scala — статически типизированный язык . . . . . . . . . . . . . . . . . . 50 1 .4 . Истоки Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8 Оглавление
Глава 2. Первые шаги в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Шаг 1 . Осваиваем Scala REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Шаг 2 . Объявляем переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Шаг 3 . Определяем функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Шаг 4 . Пишем Scala-скрипты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Шаг 5 . Организуем цикл с while и принимаем решение с if . . . . . . . . . . . . 64
Шаг 6 . Перебираем элементы с foreach и for-do . . . . . . . . . . . . . . . . . . . . 66
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Глава 3. Дальнейшие шаги в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Шаг 7 . Параметризуем массивы типами . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Шаг 8 . Используем списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Шаг 9 . Используем кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Шаг 10 . Используем множества и отображения . . . . . . . . . . . . . . . . . . . . 79
Шаг 11 . Учимся распознавать функциональный стиль . . . . . . . . . . . . . . . . 84
Шаг 12 . Преобразование с отображениями и for-yield . . . . . . . . . . . . . . . . 87
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Глава 4. Классы и объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4 .1 . Классы, поля и методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4 .2 . Когда подразумевается использование точки с запятой . . . . . . . . . . . 96 4 .3 . Объекты-одиночки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4 .4 . Case-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4 .5 . Приложение на языке Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Глава 5. Основные типы и операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5 .1 . Некоторые основные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5 .2 . Литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Целочисленные литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Литералы чисел с плавающей точкой . . . . . . . . . . . . . . . . . . . . . 107
Большие числовые литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Символьные литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Строковые литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Булевы литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5 .3 . Интерполяция строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5 .4 . Все операторы являются методами . . . . . . . . . . . . . . . . . . . . . . . . . 112 5 .5 . Арифметические операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 5 .6 . Отношения и логические операции . . . . . . . . . . . . . . . . . . . . . . . . . 116
Оглавление 9
5 .7 . Поразрядные операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5 .8 . Равенство объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 5 .9 . Приоритет и ассоциативность операторов . . . . . . . . . . . . . . . . . . . . 120 5 .10 . Обогащающие операции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Глава 6. Функциональные объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6 .1 . Спецификация класса Rational . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6 .2 . Конструирование класса Rational . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 6 .3 . Переопределение метода toString . . . . . . . . . . . . . . . . . . . . . . . . . . 128 6 .4 . Проверка соблюдения предварительных условий . . . . . . . . . . . . . . . 129 6 .5 . Добавление полей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 6 .6 . Собственные ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6 .7 . Вспомогательные конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6 .8 . Приватные поля и методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 6 .9 . Определение операторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 6 .10 . Идентификаторы в Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 6 .11 . Перегрузка методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6 .12 . Методы расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 6 .13 . Предостережение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Глава 7. Встроенные управляющие конструкции . . . . . . . . . . . . . . . . . . . . 145 7 .1 . Выражения if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 7 .2 . Циклы while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 7 .3 . Выражения for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Обход элементов коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Фильтрация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Вложенные итерации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Привязки промежуточных переменных . . . . . . . . . . . . . . . . . . . . 153
Создание новой коллекции . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 7 .4 . Обработка исключений с помощью выражений try . . . . . . . . . . . . . . 155
Генерация исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Перехват исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Условие finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Выдача значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 7 .5 . Выражения match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 7 .6 . Программирование без break и continue . . . . . . . . . . . . . . . . . . . . . . 160
10 Оглавление
7 .7 . Область видимости переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7 .8 . Рефакторинг кода, написанного в императивном стиле . . . . . . . . . . 165 7 .9 . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Глава 8. Функции и замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 8 .1 . Методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 8 .2 . Локальные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 8 .3 . Функции первого класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 8 .4 . Краткие формы функциональных литералов . . . . . . . . . . . . . . . . . . 173 8 .5 . Синтаксис заместителя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 8 .6 . Частично примененные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 8 .7 . Замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 8 .8 . Специальные формы вызова функций . . . . . . . . . . . . . . . . . . . . . . . 180
Повторяющиеся параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Именованные аргументы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Значения параметров по умолчанию . . . . . . . . . . . . . . . . . . . . . 182 8 .9 . Тип SAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 8 .10 . Хвостовая рекурсия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Трассировка функций с хвостовой рекурсией . . . . . . . . . . . . . . . 185
Ограничения хвостовой рекурсии . . . . . . . . . . . . . . . . . . . . . . . . 187
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Глава 9. Управляющие абстракции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9 .1 . Сокращение повторяемости кода . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9 .2 . Упрощение клиентского кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 9 .3 . Карринг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 9 .4 . Создание новых управляющих конструкций . . . . . . . . . . . . . . . . . . . 196 9 .5 . Передача параметров по имени . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Глава 10. Композиция и наследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 10 .1 . Библиотека двумерной разметки . . . . . . . . . . . . . . . . . . . . . . . . . . 203 10 .2 . Абстрактные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 10 .3 . Определяем методы без параметров . . . . . . . . . . . . . . . . . . . . . . . 205 10 .4 . Расширяем классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 10 .5 . Переопределяем методы и поля . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 10 .6 . Определяем параметрические поля . . . . . . . . . . . . . . . . . . . . . . . . 211 10 .7 . Вызываем конструктор суперкласса . . . . . . . . . . . . . . . . . . . . . . . . 212
Оглавление 11
10 .8 . Используем модификатор override . . . . . . . . . . . . . . . . . . . . . . . . . 213 10 .9 . Полиморфизм и динамическое связывание . . . . . . . . . . . . . . . . . . . 215 10 .10 . Объявляем финальные элементы . . . . . . . . . . . . . . . . . . . . . . . . . 217 10 .11 . Используем композицию и наследование . . . . . . . . . . . . . . . . . . . 218 10 .12 . Реализуем методы above, beside и toString . . . . . . . . . . . . . . . . . . 220 10 .13 . Определяем фабричный объект . . . . . . . . . . . . . . . . . . . . . . . . . . 223 10 .14 . Методы heighten и widen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 10 .15 . Собираем все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228