Scala. Профессиональное программирование 2022. Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста
Скачать 6.24 Mb.
|
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 |