Scala. Профессиональное программирование - Мартин Одерски - E-Book

Scala. Профессиональное программирование E-Book

Мартин Одерски

0,0

Beschreibung

«Scala. Профессиональное программирование» — главная книга по Scala, популярному языку для платформы Java, в котором сочетаются концепции объектно-ориентированного и функционального программирования, благодаря чему он превращается в уникальное и мощное средство разработки. Этот авторитетный труд, написанный создателями Scala, поможет вам пошагово изучить язык и идеи, лежащие в его основе. Данное четвертое издание полностью обновлено. Добавлен материал об изменениях, появившихся в Scala 2.13, в том числе: •новая иерархия типов коллекций; •новые конкретные типы коллекций; •новые методы, добавленные к коллекциям; •новые способы определять собственные типы коллекций; •новые упрощенные представления.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 1009

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Переводчики О. Сивченко, С. Черников

Мартин Одерски, Лекс Спун, Билл Веннерс

Scala. Профессиональное программирование. 4-е изд.. — СПб.: Питер, 2024.

ISBN 978-5-4461-1827-4

© ООО Издательство "Питер", 2024

Оглавление

Предисловие
Благодарности
Введение
Целевая аудитория
Как пользоваться книгой
Как изучать Scala
Условные обозначения
Обзор глав
Ресурсы
Исходный код
От издательства
1. Масштабируемый язык
1.1. Язык, который растет вместе с вами
1.2. Что делает Scala масштабируемым языком
1.3. Почему именно Scala
1.4. Истоки Scala
Резюме
2. Первые шаги в Scala
2.1. Шаг 1. Осваиваем интерпретатор Scala
2.2. Шаг 2. Объявляем переменные
2.3. Шаг 3. Определяем функции
2.4. Шаг 4. Пишем Scala-скрипты
2.5. Шаг 5. Организуем цикл с while и принимаем решение с if
2.6. Шаг 6. Перебираем элементы с foreach и for
Резюме
3. Дальнейшие шаги в Scala
3.1. Шаг 7. Параметризуем массивы типами
3.2. Шаг 8. Используем списки
3.3. Шаг 9. Используем кортежи
3.4. Шаг 10. Используем множества и отображения
3.5. Шаг 11. Учимся распознавать функциональный стиль
3.6. Шаг 12. Читаем строки из файла
Резюме
4. Классы и объекты
4.1. Классы, поля и методы
4.2. Когда подразумевается использование точки с запятой
4.3. Объекты-одиночки
4.4. Приложение на языке Scala
4.5. Трейт App
Резюме
5. Основные типы и операции
5.1. Некоторые основные типы
5.2. Литералы
5.3. Интерполяция строк
5.4. Все операторы являются методами
5.5. Арифметические операции
5.6. Отношения и логические операции
5.7. Поразрядные операции
5.8. Равенство объектов
5.9. Приоритет и ассоциативность операторов
5.10. Обогащающие оболочки
Резюме
6. Функциональные объекты
6.1. Спецификация класса Rational
6.2. Конструирование класса Rational
6.3. Переопределение метода toString
6.4. Проверка соблюдения предварительных условий
6.5. Добавление полей
6.6. Собственные ссылки
6.7. Вспомогательные конструкторы
6.8. Приватные поля и методы
6.9. Определение операторов
6.10. Идентификаторы в Scala
6.11. Перегрузка методов
6.12. Неявные преобразования
6.13. Предостережение
Резюме
7. Встроенные управляющие конструкции
7.1. Выражения if
7.2. Циклы while
7.3. Выражения for
7.4. Обработка исключений с помощью выражений try
7.5. Выражения match
7.6. Программирование без break и continue
7.7. Область видимости переменных
7.8. Рефакторинг кода, написанного в императивном стиле
Резюме
8. Функции и замыкания
8.1. Методы
8.2. Локальные функции
8.3. Функции первого класса
8.4. Краткие формы функциональных литералов
8.5. Синтаксис заместителя
8.6. Частично примененные функции
8.7. Замыкания
8.8. Специальные формы вызова функций
8.9. Хвостовая рекурсия
Резюме
9. Управляющие абстракции
9.1. Сокращение повторяемости кода
9.2. Упрощение клиентского кода
9.3. Карринг
9.4. Создание новых управляющих конструкций
9.5. Передача параметров по имени
Резюме
10. Композиция и наследование
10.1. Библиотека двумерной разметки
10.2. Абстрактные классы
10.3. Определяем методы без параметров
10.4. Расширяем классы
10.5. Переопределяем методы и поля
10.6. Определяем параметрические поля
10.7. Вызываем конструктор суперкласса
10.8. Используем модификатор override
10.9. Полиморфизм и динамическое связывание
10.10. Объявляем финальные элементы
10.11. Используем композицию и наследование
10.12. Реализуем методы above, beside и toString
10.13. Определяем фабричный объект
10.14. Методы heighten и widen
10.15. Собираем все воедино
Резюме
11. Иерархия Scala
11.1. Иерархия классов Scala
11.2. Как реализованы примитивы
11.3. Низшие типы
11.4. Определение собственных классов значений
Резюме
12. Трейты
12.1. Как работают трейты
12.2. Сравнение «тонких» и «толстых» интерфейсов
12.3. Пример: прямоугольные объекты
12.4. Трейт Ordered
12.5. Трейты как наращиваемые модификации
12.6. Почему не используется множественное наследование
12.7. Так все же с трейтами или без?
Резюме
13. Пакеты и импорты
13.1. Помещение кода в пакеты
13.2. Краткая форма доступа к родственному коду
13.3. Импортирование кода
13.4. Неявное импортирование
13.5. Модификаторы доступа
13.6. Объекты пакетов
Резюме
14. Утверждения и тесты
14.1. Утверждения
14.2. Тестирование в Scala
14.3. Информативные отчеты об ошибках
14.4. Использование тестов в качестве спецификаций
14.5. Тестирование на основе свойств
14.6. Подготовка и проведение тестов
Резюме
15. Case-классы и сопоставление с образцом
15.1. Простой пример
15.2. Разновидности паттернов
15.3. Ограждение образца
15.4. Наложение паттернов
15.5. Запечатанные классы
15.6. Тип Option
15.7. Паттерны везде
15.8. Большой пример
Резюме
16. Работа со списками
16.1. Литералы списков
16.2. Тип List
16.3. Создание списков
16.4. Основные операции над списками
16.5. Паттерны-списки
16.6. Методы первого порядка класса List
16.7. Методы высшего порядка класса List
16.8. Методы объекта List
16.9. Совместная обработка нескольких списков
16.10. Осмысление имеющегося в Scala алгоритма вывода типов
Резюме
17. Работа с другими коллекциями
17.1. Последовательности
17.2. Множества и отображения
17.3. Выбор между изменяемыми и неизменяемыми коллекциями
17.4. Инициализация коллекций
17.5. Кортежи
Резюме
18. Изменяемые объекты
18.1. Что делает объект изменяемым
18.2. Переназначаемые переменные и свойства
18.3. Практический пример: моделирование дискретных событий
18.4. Язык для цифровых схем
18.5. API моделирования
18.6. Моделирование электронной логической схемы
Резюме
19. Параметризация типов
19.1. Функциональные очереди
19.2. Скрытие информации
19.3. Аннотации вариантности
19.4. Проверка аннотаций вариантности
19.5. Нижние ограничители
19.6. Контравариантность
19.7. Приватные данные объекта
19.8. Верхние ограничители
Резюме
20. Абстрактные члены
20.1. Краткий обзор абстрактных членов
20.2. Члены-типы
20.3. Абстрактные val-переменные
20.4. Абстрактные var-переменные
20.5. Инициализация абстрактных val-переменных
20.6. Абстрактные типы
20.7. Типы, зависящие от пути
20.8. Уточняющие типы
20.9. Перечисления
20.10. Практический пример: работа с валютой
Резюме
21. Неявные преобразования и параметры
21.1. Неявные преобразования
21.2. Правила для неявных преобразований
21.3. Неявное преобразование в ожидаемый тип
21.4. Преобразование получателя
21.5. Неявные параметры
21.6. Контекстные ограничители
21.7. Когда применяются множественные преобразования
21.8. Отладка неявных преобразований
Резюме
22. Реализация списков
22.1. Принципиальный взгляд на класс List
22.2. Класс ListBuffer
22.3. Класс List на практике
22.4. Внешняя функциональность
Резюме
23. Возвращение к выражениям for
23.1. Выражения for
23.2. Задача N ферзей
23.3. Выполнение запросов с помощью выражений for
23.4. Трансляция выражений for
23.5. «Мы пойдем другим путем»
23.6. Обобщение for
Резюме
24. Углубленное изучение коллекций
24.1. Изменяемые и неизменяемые коллекции
24.2. Согласованность коллекций
24.3. Трейт Iterable
24.4. Трейты последовательностей Seq, IndexedSeq и LinearSeq
24.5. Множества
24.6. Отображения
24.7. Конкретные классы неизменяемых коллекций
24.8. Конкретные классы изменяемых коллекций
24.9. Массивы
24.10. Строки
24.11. Характеристики производительности
24.12. Равенство
24.13. Представления
24.14. Итераторы
24.15. Создание коллекций с нуля
24.16. Преобразования между коллекциями Java и Scala
Резюме
25. Архитектура коллекций Scala
25.1. Исключение общих операций
25.2. Интеграция новых коллекций
Резюме
26. Экстракторы
26.1. Пример извлечения адресов электронной почты
26.2. Экстракторы
26.3. Паттерны без переменных или с одной переменной
26.4. Экстракторы переменного количества аргументов
26.5. Экстракторы и паттерны последовательностей
26.6. Сравнение экстракторов и case-классов
26.7. Регулярные выражения
Резюме
27. Аннотации
27.1. Зачем нужны аннотации
27.2. Синтаксис аннотаций
27.3. Стандартные аннотации
Резюме
28. Работа с XML
28.1. Слабоструктурированные данные
28.2. Краткий обзор XML
28.3. Литералы XML
28.4. Сериализация
28.5. Разбор XML
28.6. Десериализация
28.7. Загрузка и сохранение
28.8. Сопоставление с образцом XML
Резюме
29. Модульное программирование с использованием объектов
29.1. Суть проблемы
29.2. Приложение для работы с рецептами
29.3. Абстракция
29.4. Разбиение модулей на трейты
29.5. Компоновка во время выполнения
29.6. Отслеживание экземпляров модулей
Резюме
30. Равенство объектов
30.1. Понятие равенства в Scala
30.2. Написание метода равенства
30.3. Определение равенства для параметризованных типов
30.4. Рецепты для equals и hashCode
Резюме
31. Сочетание кода на Scala и Java
31.1. Использование Scala из Java
31.2. Аннотации
31.3. Подстановочные типы
31.4. Совместная компиляция Scala и Java
31.5. Интеграция Java 8
Резюме
32. Фьючерсы и многопоточность
32.1. Неприятности в раю
32.2. Асинхронное выполнение и Try
32.3. Работа с фьючерсами
32.4. Тестирование с помощью фьючерсов
Резюме
33. Синтаксический разбор с помощью комбинаторов
33.1. Пример: арифметические выражения
33.2. Запуск парсера
33.3. Основные парсеры — регулярные выражения
33.4. Еще один пример: JSON
33.5. Вывод парсера
33.6. Реализация комбинаторов парсеров
33.7. Строковые литералы и регулярные выражения
33.8. Лексинг и парсинг
33.9. Сообщения об ошибках
33.10. Сравнение отката с LL(1)
Резюме
34. Программирование GUI
34.1. Первое Swing-приложение
34.2. Панели и разметки
34.3. Обработка событий
34.4. Пример: программа перевода градусов между шкалами Цельсия и Фаренгейта
Резюме
35. Электронная таблица SCells
35.1. Визуальная среда
35.2. Разделение введенных данных и отображения
35.3. Формулы
35.4. Синтаксический разбор формул
35.5. Вычисление
35.6. Библиотеки операций
35.7. Распространение изменений
Резюме
Приложение. Скрипты Scala на Unix и Windows
Глоссарий
Об авторах

Предисловие

Когда в 2004 году, на заре своей карьеры, я сел и выбрал малоизвестный язык под названием Scala, мне и в голову не могло прийти, что впереди меня ждет множество открытий. Поначалу мой опыт использования Scala во многом напоминал работу с другими языками: пробы, ошибки, эксперименты и открытия, заблуждения и наконец просветление. В те дни у нас было очень мало источников информации: никаких учебных пособий, блогов или опытных пользователей, желавших поделиться знаниями. А уж таких ресурсов, как эта книга, у нас точно не было. Все, что мы имели, — язык с прекрасным набором новых инструментов, которыми еще никто не умел как следует пользоваться. Это открывало новые горизонты и в то же время приводило в замешательство! С опытом программирования на Java у меня сформировались определенные ожидания, однако мои ощущения от повседневного написания кода на Scala были другими. Я помню свои первые приключения со Scala, когда мы вместе еще с одним человеком работали над небольшим проектом. Решив заняться рефакторингом (ввиду регулярного обнаружения и изучения новых возможностей и методик это случалось довольно часто), я проходил несколько этапов компиляции.

Каждый раз компилятор выдавал мне список ошибок вместе с номерами строк. И всякий раз я переходил к нужному участку кода, пытался понять, что с ним не так, вносил изменения, чтобы исправить ошибки (или, скорее, переместить их в другое место). Но компилятор раз за разом направлял меня прямо к источнику проблемы. Иногда это могло повторяться на протяжении нескольких дней без единой успешной компиляции. Но, постепенно уменьшив количество ошибок с сотни до десяти, а затем и до нуля, я наконец впервые смог скомпилировать и запустить существенно переработанный проект.

И, вопреки ожиданиям, он заработал с первого раза. Я был молодым программистом, который до этого писал только на Java, Perl, Pascal, BASIC, PHP и JavaScript, и это произвело на меня неизгладимое впечатление.

На первой конференции Scala World, которую я организовал в 2015 году, во вступительной презентации Рунара Бьярнасона (Ru'nar Bjarnason) была озвучена следующая мысль: «Ограничения освобождают, а свободы сковывают». Нагляднее всего это демонстрирует процесс компиляции в Scala: понимание того, что scalac накладывает исчерпывающий набор ограничений, не позволяющих программисту допускать предсказуемые ошибки времени выполнения (хуже которых ничего нет), должно давать ощущение свободы любому программисту. Оно должно придавать уверенность, а это, в свою очередь, позволяет экспериментировать, исследовать и вносить амбициозные изменения даже при отсутствии полноценного набора тестов.

С тех пор я продолжаю изучать Scala и даже сегодня открываю для себя новые возможности, нюансы и интересные сочетания разных функций. Я не знаю ни одного другого языка, способного увлекать своей глубиной на протяжении стольких лет.

Scala стоит на пороге больших изменений. Следующая версия, 3, будет таким же большим шагом вперед по сравнению со Scala 2, как тот, который я сделал 15 лет назад, когда перешел с Java. Повседневное программирование на Scala во многом останется прежним, но при этом мы получим доступ к широкому спектру новых возможностей, охватывающих все аспекты данного языка.

На момент написания этих строк широкое внедрение Scala 3 ожидается лишь через несколько лет, и в ближайшем будущем Scala 2 останется фактически стандартной версией языка.

В последнем выпуске Scala 2 (версия 2.13), подробно рассматриваемом в данной книге, в стандартной библиотеке появились новые, переработанные и упрощенные коллекции, вобравшие в себя множество уроков, усвоенных с момента последнего крупного изменения (Scala 2.8). Эти новые коллекции поддерживают компиляцию в Scala 2 и 3, формируя основу для большей части кода, который мы будем писать еще и в грядущем десятилетии. Учитывая то, какой интерес у людей вызывает следующий выпуск Scala, самое время обзавестись этой книгой и начать ее изучать!

Джон Претти (Jon Pretty), Краков, Польша, 14 сентября 2019 года

Благодарности

Мы благодарны за вклад в эту книгу многим людям.

Сам язык Scala — плод усилий множества специалистов. Свой вклад в проектирование и реализацию версии 1.0 внесли Филипп Альтер (Philippe Altherr), Винсент Кремет (Vincent Cremet), Жиль Дюбоше (Gilles Dubochet), Бурак Эмир (Burak Emir), Стефан Мишель (Ste'phane Micheloud), Николай Михайлов (Nikolay Mihaylov), Мишель Шинц (Michel Schinz), Эрик Стенман (Erik Stenman) и Матиас Зенгер (Matthias Zenger). К разработке второй и текущей версий языка, а также инструментальных средств подключились Фил Багвел (Phil Bagwell), Антонио Куней (Antonio Cunei), Юлиан Драгос (Iulian Dragos), Жиль Дюбоше (Gilles Dubochet), Мигель Гарсиа (Miguel Garcia), Филипп Халлер (Philipp Haller), Шон Макдирмид (Sean McDirmid), Инго Майер (Ingo Maier), Донна Малайери (Donna Malayeri), Адриан Мурс (Adriaan Moors), Хуберт Плоциничак (Hubert Plociniczak), Пол Филлипс (Paul Phillips), Александр Прокопец (Aleksandar Prokopec), Тиарк Ромпф (Tiark Rompf), Лукас Рыц (Lukas Rytz) и Джеффри Уошберн (Geoffrey Washburn).

Следует также упомянуть тех, кто участвовал в работе над структурой языка. Эти люди любезно делились с нами своими идеями в оживленных и вдохновля­ющих дискуссиях, вносили важные фрагменты кода в открытую разработку и делали весьма ценные замечания по поводу предыдущих версий. Это Гилад Браха (Gilad Bracha), Натан Бронсон (Nathan Bronson), Коаюан (Caoyuan), Эймон Кэннон (Aemon Cannon), Крейг Чамберс (Craig Chambers), Крис Конрад (Chris Conrad), Эрик Эрнст (Erik Ernst), Матиас Феллизен (Matthias Felleisen), Марк Харра (Mark Harrah), Шрирам Кришнамурти (Shriram Krishnamurti), Гэри Ливенс (Gary Leavens), Дэвид Макивер (David MacIver), Себастьян Манит (Sebastian Maneth), Рикард Нильссон (Rickard Nilsson), Эрик Мейер (Erik Meijer), Лалит Пант (Lalit Pant), Дэвид Поллак (David Pollak), Джон Претти (Jon Pretty), Клаус Остерман (Klaus Ostermann), Хорхе Ортис (Jorge Ortiz), Дидье Реми (Didier Rémy), Майлз Сабин (Miles Sabin), Виджей Сарасват (Vijay Saraswat), Даниэль Спивак (Daniel Spiewak), Джеймс Страчан (James Strachan), Дон Симе (Don Syme), Эрик Торребор (Erik Torreborre), Мэдс Торгерсен (Mads Torgersen), Филип Уодлер (Philip Wadler), Джейми Уэбб (Jamie Webb), Джон Уильямс (John Williams), Кевин Райт (Kevin Wright) и Джейсон Зауг (Jason Zaugg). Очень полезные отзывы, которые помогли нам улучшить язык и его инструментальные средства, были получены от людей, подписанных на наши рассылки по Scala.

Джордж Бергер (George Berger) усердно работал над тем, чтобы процесс создания и размещения книги в Интернете протекал гладко. Как результат, в данном проекте не было никаких технических сбоев.

Ценные отзывы о начальных вариантах текста книги были получены нами от многих людей. Наших благодарностей заслуживают Эрик Армстронг (Eric Armstrong), Джордж Бергер (George Berger), Алекс Блевитт (Alex Blewitt), Гилад Браха (Gilad Bracha), Уильям Кук (William Cook), Брюс Экель (Bruce Eckel), Стефан Мишель (Ste'phane Micheloud), Тод Мильштейн (Todd Millstein), Дэвид Поллак (David Pollak), Фрэнк Соммерс (Frank Sommers), Филип Уодлер (Philip Wadler) и Матиас Зенгер (Matthias Zenger). Спасибо также представителям Silicon Valley Patterns group за их весьма полезный обзор. Это Дейв Астелс (Dave Astels), Трейси Бялик (Tracy Bialik), Джон Брюер (John Brewer), Эндрю Чейз (Andrew Chase), Брэдфорд Кросс (Bradford Cross), Рауль Дюк (Raoul Duke), Джон П. Эйрих (John P. Eurich), Стивен Ганц (Steven Ganz), Фил Гудвин (Phil Goodwin), Ральф Йочем (Ralph Jocham), Ян-Фа Ли (Yan-Fa Li), Тао Ма (Tao Ma), Джеффри Миллер (Jeffery Miller), Суреш Пай (Suresh Pai), Русс Руфер (Russ Rufer), Дэйв У. Смит (Dave W. Smith), Скотт Торнквест (Scott Turnquest), Вальтер Ваннини (Walter Vannini), Дарлин Уоллах (Darlene Wallach) и Джонатан Эндрю Уолтер (Jonathan Andrew Wolter). Кроме того, хочется поблагодарить Дуэйна Джонсона (Dewayne Johnson) и Кима Лиди (Kim Leedy) за помощь в художественном оформлении обложки, а также Фрэнка Соммерса (Frank Sommers) — за работу над алфавитным указателем.

Хотелось бы выразить особую благодарность и всем нашим читателям, приславшим комментарии. Они нам очень пригодились для повышения качества книги. Мы не в состоянии опубликовать имена всех приславших комментарии, но объявим имена тех читателей, кто прислал не менее пяти комментариев на стадии eBook PrePrint™, воспользовавшись ссылкой Suggest. Отсортируем их имена по убыванию количества комментариев, а затем в алфавитном порядке. Наших благодарностей заслуживают Дэвид Бизак (David Biesack), Дон Стефан (Donn Stephan), Матс Хенриксон (Mats Henricson), Роб Диккенс (Rob Dickens), Блэр Захак (Blair Zajac), Тони Слоан (Tony Sloane), Найджел Харрисон (Nigel Harrison), Хавьер Диас Сото (Javier Diaz Soto), Уильям Хелан (William Heelan), Джастин Фурдер (Justin Forder), Грегор Перди (Gregor Purdy), Колин Перкинс (Colin Perkins), Бьярте С. Карлсен (Bjarte S. Karlsen), Эрвин Варга (Ervin Varga), Эрик Уиллигерс (Eric Willigers), Марк Хейс (Mark Hayes), Мартин Элвин (Martin Elwin), Калум Маклин (Calum MacLean), Джонатан Уолтер (Jonathan Wolter), Лес Прушински (Les Pruszynski), Сет Тисуе (Seth Tisue), Андрей Формига (Andrei Formiga), Дмитрий Григорьев (Dmitry Grigoriev), Джордж Бергер (George Berger), Говард Ловетт (Howard Lovatt), Джон П. Эйрих (John P. Eurich), Мариус Скуртеску (Marius Scurtescu), Джефф Эрвин (Jeff Ervin), Джейми Уэбб (Jamie Webb), Курт Зольман (Kurt Zoglmann), Дин Уэмплер (Dean Wampler), Николай Линдберг (Nikolaj Lindberg), Питер Маклейн (Peter McLain), Аркадиуш Стрыйски (Arkadiusz Stryjski), Шанки Сурана (Shanky Surana), Крейг Бордолон (Craig Bordelon), Александр Пэтри (Alexandre Patry), Филип Моэнс (Filip Moens), Фред Янон (Fred Janon), Джефф Хеон (Jeff Heon), Борис Лорбер (Boris Lorbeer), Джим Менар (Jim Menard), Тим Аццопарди (Tim Azzopardi), Томас Юнг (Thomas Jung), Уолтер Чанг (Walter Chang), Йерун Дийкмейер (Jeroen Dijkmeijer), Кейси Боумен (Casey Bowman), Мартин Смит (Martin Smith), Ричард Даллауэй (Richard Dallaway), Антони Стаббс (Antony Stubbs), Ларс Вестергрен (Lars Westergren), Маартен Хазевинкель (Maarten Hazewinkel), Мэтт Рассел (Matt Russell), Ремигиус Михаловский (Remigiusz Michalowski), Андрей Толопко (Andrew Tolopko), Кертис Стэнфорд (Curtis Stanford), Джошуа Каш (Joshua Cough), Земен Денг (Zemian Deng), Кристофер Родригес Масиас (Christopher Rodrigues Macias), Хуан Мигель Гарсия Лопес (Juan Miguel Garcia Lopez), Мишель Шинц (Michel Schinz), Питер Мур (Peter Moore), Рэндолф Кале (Randolph Kahle), Владимир Кельман (Vladimir Kelman), Даниэль Гронау (Daniel Gronau), Дирк Детеринг (Dirk Detering), Хироаки Накамура (Hiroaki Nakamura), Оле Хогаард (Ole Hougaard), Бхаскар Маддала (Bhaskar Maddala), Дэвид Бернар (David Bernard), Дерек Махар (Derek Mahar), Джордж Коллиас (George Kollias), Кристиан Нордал (Kristian Nordal), Нормен Мюллер (Normen Mueller), Рафаэль Феррейра (Rafael Ferreira), Бинил Томас (Binil Thomas), Джон Нильсон (John Nilsson), Хорхе Ортис (Jorge Ortiz), Маркус Шульте (Marcus Schulte), Вадим Герасимов (Vadim Gerasimov), Камерон Таггарт (Cameron Taggart), Джон-Андерс Тейген (Jon-Anders Teigen), Сильвестр Забала (Silvestre Zabala), Уилл Маккуин (Will McQueen) и Сэм Оуэн (Sam Owen).

Хочется также сказать спасибо тем, кто отправил сообщения о замеченных неточностях после публикации первых двух изданий. Это Феликс Зигрист (Felix Siegrist), Лотар Мейер-Лербс (Lothar Meyer-Lerbs), Диетард Михаэлис (Diethard Michaelis), Рошан Даврани (Roshan Dawrani), Донн Стефан (Donn Stephan), Уильям Утер (William Uther), Франсиско Ревербель (Francisco Reverbel), Джим Балтер (Jim Balter), Фрик де Брюйн (Freek de Bruijn), Амброз Лэнг (Ambrose Laing), Сехар Прабхала (Sekhar Prabhala), Левон Салдамли (Levon Saldamli), Эндрю Бурсавич (Andrew Bursavich), Хьялмар Петерс (Hjalmar Peters), Томас Фер (Thomas Fehr), Ален О’Ди (Alain O’Dea), Роб Диккенс (Rob Dickens), Тим Тейлор (Tim Taylor), Кристиан Штернагель (Christian Sternagel), Мишель Паризьен (Michel Parisien), Джоэл Нили (Joel Neely), Брайан МакКеон (Brian McKeon), Томас Фер (Thomas Fehr), Джозеф Эллиотт (Joseph Elliott), Габриэль да Силва Рибейро (Gabriel da Silva Ribeiro), Томас Фер (Thomas Fehr), Пабло Рипольес (Pablo Ripolles), Дуглас Гейлор (Douglas Gaylor), Кевин Сквайр (Kevin Squire), Гарри-Антон Талвик (Harry-Anton Talvik), Кристофер Симпкинс (Christopher Simpkins), Мартин Витман-Функ (Martin Witmann-Funk), Джим Балтер (Jim Balter), Питер Фостер (Peter Foster), Крейг Бордолон (Craig Bordelon), Хайнц-Питер Гум (Heinz-Peter Gumm), Питер Чапин (Peter Chapin), Кевин Райт (Kevin Wright), Анантан Сринивасан (Ananthan Srinivasan), Омар Килани (Omar Kilani), Дон Стефан (Donn Stephan), Гюнтер Ваффлер (Guenther Waffler).

Лекс хотел бы поблагодарить специалистов, среди которых Аарон Абрамс (Aaron Abrams), Джейсон Адамс (Jason Adams), Генри и Эмили Крутчер (Henry and Emily Crutcher), Джои Гибсон (Joey Gibson), Гунар Хиллерт (Gunnar Hillert), Мэтью Линк (Matthew Link), Тоби Рейлтс (Toby Reyelts), Джейсон Снейп (Jason Snape), Джон и Мелинда Уэзерс (John and Melinda Weathers), и всех представителей Atlanta Scala Enthusiasts за множество полезных обсуждений структуры языка, его математических основ и способов представления языка Scala специалистам-практикам.

Особую благодарность хочется выразить Дэйву Брикчетти (Dave Briccetti) и Адриану Мурсу (Adriaan Moors) за рецензирование третьего издания, а также Маркони Ланна (Marconi Lanna) не только за рецензирование, но и за мотивацию выпустить третье издание, которая возникла после разговора о новинках, появившихся со времени выхода предыдущего издания.

Билл хотел бы поблагодарить нескольких специалистов за предоставленную информацию и советы по изданию книги. Его благодарность заслужили Гэри Корнелл (Gary Cornell), Грег Доенч (Greg Doench), Энди Хант (Andy Hunt), Майк Леонард (Mike Leonard), Тайлер Ортман (Tyler Ortman), Билл Поллок (Bill Pollock), Дейв Томас (Dave Thomas) и Адам Райт (Adam Wright). Билл также хотел бы поблагодарить Дика Уолла (Dick Wall) за сотрудничество над разработкой нашего курса Stairway to Scala, который большей частью основывался на материалах, вошедших в эту книгу. Наш многолетний опыт преподавания курса Stairway to Scala помог повысить ее качество. И наконец, Билл хотел бы выразить благодарность Дарлин Грюндль (Darlene Gruendl) и Саманте Вулф (Samantha Woolf) за помощь в завершении третьего издания.

Наконец, мы хотели бы поблагодарить Жюльена Ричарда-Фоя за работу над обновлением четвертого издания этой книги до версии Scala 2.13, в частности за перепроектирование библиотеки коллекций.