Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Scala для нетерпеливых

Покупка
Артикул: 712488.02.99
Книга в сжатой форме описывает, что можно делать на языке Scala, и как это делать. Кей Хорстманн, автор всемирного бестселлера «Core Java», дает быстрое и практическое введение в язык программирования, основанное на примерах программного кода. Он знакомит читателя с концепциями языка Scala и приемами программирования небольшими «порциями», что позволяет быстро осваивать их и применять на практике. Практические примеры помогут вам пройти все стадии компетентности, от новичка до эксперта. Второе издание было обновлено до поддержки версии Scala 2.12 и демонстрирует самые современные приемы использования языка. В него было добавлено описание последних нововведений в Scala, включая интерполяцию строк, динамический вызов, неявные классы и объекты Future. Издание предназначено для программистов на Java, C++ и С#, которые желают освоить язык Scala и в целом функциональное программирование.
Хорстманн, К. Scala для нетерпеливых : практическое пособие / К. Хорстманн ; пер. с англ. А. Н. Киселева. - 2-е изд. - Москва : ДМК Пресс, 2020. - 414 с. - ISBN 978-5-97060-840-1. - Текст : электронный. - URL: https://znanium.com/catalog/product/1838845 (дата обращения: 19.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Scala для нетерпеливых

Второе издание

Кей Хостманн

Scala for the Impatient

Second Edition

Cay S. Hostmann

Scala для нетерпеливых

Второе издание, переработанное и дополненное

Москва, 2020

Кей Хостманн

УДК 004.432.42Scala
ББК 32.973-018.1

X84

Хорстманн К.

Х84
Scala для нетерпеливых / пер. с англ. А. Н. Киселева – 2-е изд. – 
М.: ДМК Пресс, 2020. – 414 с.: ил.

ISBN 978-5-97060-840-1

Книга в сжатой форме описывает, что можно делать на языке Scala, 

и как это делать. Кей Хорстманн, автор всемирного бестселлера «Core 
Java», дает быстрое и практическое введение в язык программирования, основанное на примерах программного кода. Он знакомит читателя 
с концепциями языка Scala и приемами программирования небольшими 
«порциями», что позволяет быстро осваивать их и применять на практике. 
Практические примеры помогут вам пройти все стадии компетентности, 
от новичка до эксперта.

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

Издание предназначено для программистов на Java, C++ и C#, которые 

желают освоить язык Scala и в целом функциональное программирование.

УДК 004.432.42Scala
ББК 32.973-018.1

Все права защищены. Любая часть этой книги не может быть воспроиз
ведена в какой бы то ни было форме и какими бы то ни было средствами без 
письменного разрешения владельцев авторских прав.

Материал, изложенный в данной книге, многократно проверен. Но, по
скольку вероятность технических ошибок все равно существует, издательство 
не может гарантировать абсолютную точность и правильность приводимых 
сведений. В связи с этим издательство не несет ответственности за возможные 
ошибки, связанные с использованием книги.

ISBN 978-0-13-454056-6 (анг.)
Copyright © 2017 Pearson Education Inc.

ISBN 978-5-97060-840-1 (рус.)
© Оформление, перевод ДМК Пресс

Моей жене, сделавшей эту книгу возможной,  
и моим детям, сделавшим ее необходимой

Содержание

Предисловие к первому изданию................................... 15

Вступление........................................................................... 17

Об авторе.............................................................................. 19

Глава 1. Основы................................................................... 20

1.1..Интерпретатор.Scala......................................................... 20
1.2..Объявление.значений.и.переменных................................. 23
1.3..Часто.используемые.типы.................................................. 25
1.4..Арифметика.и.перегрузка.операторов............................... 26
1.5..Вызов.функций.и.методов.................................................. 28
1.6..Метод.apply....................................................................... 29
1.7..Scaladoc............................................................................ 31
Упражнения.............................................................................. 35

Глава 2. Управляющие структуры и функции............... 37

2.1..Условные.выражения......................................................... 38
2.2..Завершение.инструкций.................................................... 40
2.3..Блочные.выражения.и.присваивание................................. 41
2.4..Ввод.и.вывод..................................................................... 42
2.5..Циклы................................................................................ 44
2.6..Расширенные.циклы.for..................................................... 45
2.7..Функции............................................................................ 47
2.8..Аргументы.по.умолчанию.и.именованные.аргументы. .L1..... 48
2.9..Переменное.количество.аргументов. .L1.............................. 49
2.10..Процедуры....................................................................... 50

Содержание

2.11..Ленивые.значения. .L1....................................................... 51
2.12..Исключения..................................................................... 52
Упражнения.............................................................................. 55

Глава 3. Работа с массивами........................................... 57

3.1..Массивы.фиксированной.длины........................................ 58
3.2..Массивы.переменной.длины:.буферы................................ 58
3.3..Обход.массивов.и.буферов................................................ 59
3.4..Преобразование.массивов................................................ 60
3.5..Типичные.алгоритмы......................................................... 62
3.6..Расшифровываем.Scaladoc............................................... 64
3.7..Многомерные.массивы...................................................... 66
3.8..Взаимодействие.с.Java...................................................... 66
Упражнения.............................................................................. 68

Глава 4. Ассоциативные массивы и кортежи............... 70

4.1..Конструирование.ассоциативных.массивов....................... 71
4.2..Доступ.к.значениям.в.ассоциативных.массивах................. 72
4.3..Изменение.значений.в.ассоциативных.массивах............... 72
4.4..Обход.элементов.ассоциативных.массивов....................... 74
4.5..Сортированные.ассоциативные.массивы.......................... 74
4.6..Взаимодействие.с.Java...................................................... 75
4.7..Кортежи............................................................................. 76
4.8..Функция.zip........................................................................ 77
Упражнения.............................................................................. 77

Глава 5. Ассоциативные массивы и кортежи............... 79

5.1..Простые.классы.и.методы.без.параметров........................ 80
5.2..Свойства.с.методами.доступа............................................ 81
5.3..Свойства.только.с.методами.чтения.................................. 83
5.4..Приватные.поля.объектов.................................................. 85
5.5..Свойства.компонентов. .L1.................................................. 86
5.6..Дополнительные.конструкторы.......................................... 87
5.7..Главный.конструктор.......................................................... 88
5.8..Вложенные.классы. .L1........................................................ 91
Упражнения.............................................................................. 93

Содержание

Глава 6. Объекты................................................................. 96

6.1..Объекты-одиночки............................................................. 96
6.2..Объекты-компаньоны........................................................ 97
6.3..Объекты,.расширяющие.классы.или.трейты...................... 98
6.4..Метод.apply....................................................................... 99
6.5..Объект,.представляющий.приложение..............................100
6.6..Перечисления...................................................................101
Упражнения.............................................................................103

Глава 7. Пакеты и импортирование...............................104

7.1..Пакеты..............................................................................105
7.2..Правила.видимости..........................................................106
7.3..Объявления.цепочек.пакетов............................................108
7.4..Объявления.в.начале.файла..............................................108
7.5..Объекты.пакетов...............................................................109
7.6..Видимость.внутри.пакетов................................................110
7.7..Импортирование..............................................................111
7.8..Импортирование.возможно.в.любом.месте......................112
7.9..Переименование.и.сокрытие.членов.................................112
7.10..Неявный.импорт.............................................................113
Упражнения.............................................................................113

Глава 8. Наследование.....................................................115

8.1..Наследование.классов......................................................115
8.2..Переопределение.методов...............................................116
8.3..Проверка.и.приведение.типов..........................................117
8.4..Защищенные.поля.и.методы.............................................118
8.5..Создание.суперклассов....................................................118
8.6..Переопределение.полей...................................................120
8.7..Анонимные.подклассы......................................................121
8.8..Абстрактные.классы.........................................................122
8.9..Абстрактные.поля.............................................................122
8.10..Порядок.создания.и.опережающие.определения. .L3........123
8.11..Иерархия.наследования.в.Scala......................................125
8.12..Равенство.объектов. .L1....................................................128
8.13..Классы-значения. .L2........................................................129
Упражнения.............................................................................131

Содержание

Глава 9. Файлы и регулярные выражения....................133

9.1..Чтение.строк.....................................................................134
9.2..Чтение.символов..............................................................134
9.3..Чтение.лексем.и.чисел......................................................135
9.4..Чтение.из.URL.и.других.источников...................................136
9.5..Чтение.двоичных.файлов..................................................136
9.6..Запись.в.текстовые.файлы................................................136
9.7..Обход.каталогов...............................................................137
9.8..Сериализация...................................................................137
9.9..Управление.процессами. .А2..............................................138
9.10..Регулярные.выражения...................................................141
9.11..Группы.в.регулярных.выражениях...................................142
Упражнения.............................................................................143

Глава 10. Трейты................................................................145

10.1..Почему.не.поддерживается.множественное..
наследование?........................................................................146
10.2..Трейты.как.интерфейсы..................................................148
10.3..Трейты.с.конкретными.реализациями.............................149
10.4..Объекты.с.трейтами........................................................150
10.5..Многоуровневые.трейты.................................................150
10.6..Переопределение.абстрактных.методов.в.трейтах..........152
10.7..Трейты.с.богатыми.интерфейсами..................................153
10.8..Конкретные.поля.в.трейтах.............................................154
10.9..Абстрактные.поля.в.трейтах............................................155
10.10..Порядок.конструирования.трейтов...............................156
10.11..Инициализация.полей.трейтов......................................158
10.12..Трейты,.наследующие.классы.......................................160
10.13..Собственные.типы. .L2....................................................161
10.14..За.кулисами..................................................................162
Упражнения.............................................................................164

Глава 11. Операторы.........................................................167

11.1..Идентификаторы............................................................168
11.2..Инфиксные.операторы....................................................169
11.3..Унарные.операторы........................................................170

Содержание

11.4..Операторы.присваивания...............................................171
11.5..Приоритет......................................................................171
11.6..Ассоциативность............................................................172
11.7..Методы.apply.и.update....................................................173
11.8..Экстракторы. .L2...............................................................174
11.9..Экстракторы.с.одним.аргументом..
или.без.аргументов. .L2.............................................................177
11.10..Метод.unapplySeq. .L2.....................................................177
11.11..Динамический.вызов. .L2................................................178
Упражнения.............................................................................182

Глава 12. Функции высшего порядка............................185

12.1..Функции.как.значения.....................................................186
12.2..Анонимные.функции.......................................................187
12.3..Функции.с.функциональными.параметрами....................188
12.4..Вывод.типов...................................................................189
12.5..Полезные.функции.высшего.порядка..............................190
12.6..Замыкания......................................................................192
12.7..Преобразование.функций.в.SAM.....................................193
12.8..Карринг..........................................................................194
12.9..Абстракция.управляющих.конструкций...........................196
12.10..Выражение.return..........................................................198
Упражнения.............................................................................199

Глава 13. Коллекции.........................................................201

13.1..Основные.трейты.коллекций...........................................202
13.2..Изменяемые.и.неизменяемые.коллекции.......................204
13.3..Последовательности.......................................................205
13.4..Списки............................................................................207
13.5..Множества......................................................................208
13.7..Операторы.добавления.и.удаления.элементов...............210
13.7..Общие.методы................................................................212
13.8..Функции.map.и.flatMap....................................................214
13.9..Функции.reduce,.fold.и.scan. .А3........................................216
13.10..Функция.zip...................................................................220
13.11..Итераторы....................................................................222

Содержание

13.12..Потоки. .А3......................................................................223
13.13..Ленивые.представления. .А3...........................................225
13.14..Взаимодействие.с.коллекциями.Java............................226
13.15..Параллельные.коллекции..............................................227
Упражнения.............................................................................229

Глава 14. Сопоставление с образцом  
и case-классы.....................................................................232

14.1..Лучше,.чем.switch............................................................233
14.2..Ограничители.................................................................234
14.3..Переменные.в.образцах..................................................235
14.4..Сопоставление.c.типами.................................................236
14.5..Сопоставление.с.массивами,.списками.и.кортежами......237
14.6..Экстракторы...................................................................238
14.7..Образцы.в.объявлениях.переменных..............................239
14.8..Образцы.в.выражениях.for..............................................240
14.9..Case-классы...................................................................241
14.10..Метод.copy.и.именованные.параметры.........................242
14.11..Инфиксная.нотация.в.предложениях.case.....................243
14.12..Сопоставление.с.вложенными.структурами..................244
14.13..Так.ли.необходимы.case-классы?..................................245
14.14..Запечатанные.классы...................................................247
14.15..Имитация.перечислений...............................................247
14.16..Тип.Option.....................................................................248
14.17..Частично.определенные.функции. .L2.............................249
Упражнения.............................................................................251

Глава 15. Аннотации..........................................................254

15.1..Что.такое.аннотации?......................................................255
15.2..Что.можно.аннотировать?...............................................256
15.3..Аргументы.аннотаций.....................................................257
15.4..Реализация.аннотаций....................................................258
15.5..Аннотации.для.элементов.Java........................................259
15.6..Аннотации.для.оптимизации...........................................262
15.7..Аннотации.ошибок.и.предупреждений............................267
Упражнения.............................................................................269

Содержание

Глава 16. Обработка XML.................................................271

16.1..Литералы.XML.................................................................272
16.2..Узлы.XML........................................................................273
16.3..Атрибуты.элементов.......................................................274
16.4..Встроенные.выражения..................................................276
16.5..Выражения.в.атрибутах...................................................277
16.6..Необычные.типы.узлов....................................................278
16.7..XPath-подобные.выражения............................................279
16.8..Сопоставление.с.образцом.............................................281
16.9..Модификация.элементов.и.атрибутов.............................282
16.10..Трансформация.XML.....................................................283
16.11..Загрузка.и.сохранение..................................................284
16.12..Пространства.имен.......................................................287
Упражнения.............................................................................288

Глава 17. Объекты Future.................................................290

17.1..Запуск.асинхронных.заданий.в.объектах.Future...............291
17.2..Ожидание.результатов....................................................294
17.3..Класс.Try.........................................................................295
17.4..Обратные.вызовы...........................................................296
17.5..Комбинирование.заданий.в.объектах.Future....................297
17.6..Другие.преобразования.объектов.Future.........................300
17.7..Методы.объекта.Future....................................................302
17.8..Объекты.Promise.............................................................304
17.9..Контексты.выполнения...................................................306
Упражнения.............................................................................307

Глава 18. Параметризованные типы.............................310

18.1..Обобщенные.классы.......................................................311
18.2..Обобщенные.функции.....................................................312
18.3..Границы.изменения.типов...............................................312
18.4..Границы.представления..................................................314
18.5..Границы.контекста..........................................................314
18.6..Границы.контекста.ClassTag............................................315
18.7..Множественные.границы................................................316
17.8..Ограничение.типов. .L3.....................................................316

Содержание

18.9..Вариантность..................................................................318
18.10..Ко-.и.контравариантные.позиции..................................320
18.11..Объекты.не.могут.быть.обобщенными...........................322
18.12..Подстановочный.символ...............................................323
Упражнения.............................................................................324

Глава 19. Дополнительные типы....................................326

19.1..Типы-одиночки...............................................................327
19.2..Проекции.типов..............................................................329
19.3..Цепочки..........................................................................330
19.4..Псевдонимы.типов..........................................................331
19.5..Структурные.типы...........................................................332
19.6..Составные.типы..............................................................332
19.7..Инфиксные.типы.............................................................334
19.8..Экзистенциальные.типы.................................................334
19.9..Система.типов.языка.Scala.............................................336
19.10..Собственные.типы........................................................337
19.11..Внедрение.зависимостей.............................................338
19.12..Абстрактные.типы. .L3.....................................................341
19.13..Родовой.полиморфизм. .L3.............................................343
19.14..Типы.высшего.порядка. .L3..............................................346
Упражнения.............................................................................350

Глава 20. Парсинг..............................................................353

20.1..Грамматики....................................................................354
20.2..Комбинирование.операций.парсера...............................356
20.3..Преобразование.результатов.парсинга...........................358
20.4..Отбрасывание.лексем.....................................................360
20.5..Создание.деревьев.синтаксического.анализа.................361
20.6..Уход.от.левой.рекурсии...................................................361
20.7..Дополнительные.комбинаторы.......................................363
20.8..Уход.от.возвратов...........................................................366
20.9..Packrat-парсеры.............................................................367
20.10..Что.такое.парсеры?.......................................................368
20.11..Парсеры.на.основе.регулярных.выражений...................369
20.12..Парсеры.на.основе.лексем............................................370

Содержание

20.13..Обработка.ошибок........................................................372
Упражнения.............................................................................374

Глава 21. Неявные параметры и преобразования.....376

21.1..Неявные.преобразования...............................................377
21.2..Использование.неявных.преобразований..
для.расширения..существующих.библиотек............................378
21.3..Импорт.неявных.преобразований...................................379
21.4..Правила.неявных.преобразований..................................381
21.5..Неявные.параметры........................................................382
21.6..Неявные.преобразования.с.неявными.параметрами.......383
21.7..Границы.контекста..........................................................385
21.8..Классы.типов..................................................................386
21.9..Неявный.параметр.подтверждения.................................389
21.10..Аннотация.@implicitNotFound........................................390
21.11..Тайна.CanBuildFrom.......................................................391
Упражнения.............................................................................393

Предметный указатель.....................................................395

Предисловие к первому изданию

Когда я встретил Кея Хорстманна (Cay Horstmann) несколько лет 
тому назад, он сказал, что необходимо написать хорошую вводную 
книгу, описывающую язык Scala. Как раз перед этим вышла моя 
собственная книга, поэтому я, разумеется, спросил его, что в ней не 
так. Он ответил, что книга замечательная, но слишком большая – 
его студентам просто не хватает терпения прочитать все восемьсот 
страниц книги «Programming in Scala». Мне не оставалось ничего 
иного, как признать его правоту. И он вознамерился исправить ситуацию, написав книгу «Scala для нетерпеливых».
Я очень рад, что его книга наконец вышла, потому что она полностью соответствует своему названию. Она представляет собой весьма практичное введение в язык программирования Scala, описывает, 
в частности, чем этот язык отличается от Java, как преодолевать некоторые типичные проблемы, возникающие при его изучении, и как 
писать хороший программный код на языке Scala.
Scala – чрезвычайно выразительный и гибкий язык программирования. Он позволяет разработчикам библиотек использовать весьма 
сложные, высокоуровневые абстракции, чтобы пользователи этих 
библиотек, в свою очередь, могли легко и просто выражать свои 
мысли. В зависимости от того, с каким кодом вы столкнетесь, он 
может казаться очень простым или очень сложным.
Год назад я попытался дать некоторые разъяснения, определив 
ряд уровней для языка Scala и его стандартной библиотеки. Всего 
было выделено по три уровня для прикладных программистов и для 
создателей библиотек. Начальные уровни были просты в изучении, 
и их было вполне достаточно, чтобы можно было начать писать программы. Знания, получаемые на средних уровнях, позволяют писать 
более выразительные и более функциональные программы, а библиотеки более гибкие в использовании. Освоив высшие уровни, 
программисты становятся экспертами, способными решать специализированные задачи. В то время я писал:

Предисловие к первому изданию

Я надеюсь, что это поможет начинающим решить, в каком порядке изучать темы, а учителям и авторам книг подскажет, 
в каком порядке представлять материал.

Книга Кея стала первой, где эта идея была воплощена в жизнь. 
Каждая глава отмечена значком, обозначающим ее уровень, который 
сообщает читателю, насколько простой или сложной она является 
и на кого ориентирована – на разработчиков библиотек или прикладных программистов.
Как можно догадаться, первые главы представляют собой быстрое 
введение в основные возможности языка Scala. Но книга не останавливается на этом. Она также охватывает множество концепций 
«среднего» уровня и, наконец, доходит до описания весьма сложных 
тем, которые обычно не рассматриваются во вводных книгах, таких 
как создание парсер-комбинаторов или использование ограниченных продолжений. Метки, обозначающие уровень, могут служить 
руководством при выборе глав для чтения. Кею удалось просто и доходчиво рассказать даже о самых сложных понятиях.
Мне настолько понравилась идея книги «Scala для нетерпеливых», что я предложил Кею и его редактору Грегу Доенчу (Greg 
Doench) выложить первую часть книги в свободный доступ на вебсайте Typesafe1. Они любезно согласились с моим предложением, за 
что я очень благодарен им. Теперь любой желающий сможет быстро 
обратиться к самому лучшему, на мой взгляд, компактному введению в язык Scala.
Мартин Одерски (Martin Odersky)
Январь 2012

1 http://typesafe.com/resources/free-books. – Прим. перев.

Вступление

Развитие языков Java и C++ существенно замедлилось, и программисты, стремящиеся использовать самые современные технологии, 
обратили свои взоры на другие языки. Scala – весьма интересный 
выбор. Я считаю, что это самый привлекательный вариант для программистов, стремящихся повысить свою продуктивность. Scala имеет выразительный синтаксис, который выглядит весьма свежо после 
приевшихся шаблонов Java. Программы на этом языке выполняются 
под управлением виртуальной машины Java, что открывает доступ 
к огромному количеству библиотек и инструментов. Но виртуальная 
машина Java – не единственная среда выполнения для программ на 
Scala. В рамках проекта ScalaJS разрабатывается код на JavaScript, 
позволяющий писать серверный и клиентский код веб-приложений 
на языке, отличном от JavaScript. Scala поддерживает функциональный стиль программирования, не отказываясь при этом от объектноориентированного, давая возможность осваивать новые парадигмы 
постепенно. Интерпретатор дает возможность быст ро опробовать 
свои идеи, что превращает изучение Scala в весьма увлекательное 
занятие. Наконец, язык Scala является статически типизированным 
языком, что позволяет компилятору находить ошибки, а вам не тратить время на их поиск в работающей программе.
Я написал эту книгу для нетерпеливых читателей, желающих приступить к программированию на языке Scala немедленно. Я полагаю, что вы знакомы с Java, C# или C++, и потому не буду утруждать 
себя объяснением, что такое переменные, циклы или классы. Я не 
буду терпеливо перечислять все особенности языка, я не буду читать 
лекции о превосходстве одной парадигмы над другой, и я не заставлю вас продираться сквозь длинные искусственные примеры. Вместо этого вы будете получать необходимую информацию небольшими порциями, чтобы ее можно было быстро прочитать и вернуться 
к ней при необходимости.
Scala – сложный язык, но вы сможете эффективно использовать 
его, даже не зная всех его тонкостей. Мартин Одерски (Martin Od
Вступление

ersky), создатель языка Scala, определил уровни владения языком 
для прикладных программистов и разработчиков библиотек, перечисленные в табл. П.1.

Таблица П.1. Уровни владения языком Scala

Прикладные  
программисты
Разработчики  
библиотек
Общий уровень  
владения языком
Начальный.A1
Начальный

Переходный..A2.
Простой..L1.
Переходный

Эксперт..A3.
Профессиональный..L2.
Профессиональный

Эксперт..L3.
Эксперт

Каждая глава (а иногда и отдельные разделы) отмечены специальным значком, обозначающим уровень владения языком, необходимым для ее чтения. Главы следуют по возрастанию уровня 
сложности  A1 ,  L1 ,  A2 ,  L2 ,  A3 ,  L3 . Даже если вы не планируете 
создавать собственных библиотек, знание инструментов Scala, которыми пользуются разработчики библиотек, поможет вам эффективнее использовать чужие библиотеки. Надеюсь, вам понравится 
изучать язык Scala с помощью этой книги. 
Это второе издание книги обновлено до версии Scala 2.12. Я добавил описание новых особенностей языка, таких как интерполяция 
строк, динамический вызов, неявные классы и объекты future, а также обновил все главы в соответствии с современными приемами 
программирования на Scala. 
Я очень благодарен Дмитрию Кирсанову (Dmitry Kirsanov) 
и Алине Кирсановой (Alina Kirsanova), превратившим мою рукопись в формате XHTML в замечательную книгу и позволившим 
мне сконцентрироваться на содержимом, не отвлекаясь на оформление. Любой автор скажет, насколько это здорово!
Книгу рецензировали: Адриан Кумиски (Adrian Cumiskey), Майк 
Дэвис (Mike Davis), Роб Диккенс (Rob Dickens), Стив Хайнс (Steve 
Haines), Сьюзан Поттер (Susan Potter) ,Даниэль Собрал (Daniel Sobral), Крейг Татарин (Craig Tataryn), Дэвид Уоленд (David Walend) 
и Уильям Уилер (William Wheeler). Спасибо вам за ваши комментарии и предложения!
Наконец, как всегда, хочу выразить признательность моему редактору Грегу Доенчу (Greg Doench) за то, что подал идею написать 
эту книгу, и за его поддержку в процессе работы.

Кей Хорстманн (Cay Horstmann)
Сан-Франциско, 2012

Об авторе

Кей Хорстманн (Cay S. Horstmann) – основной автор книги «Core 
Java™, Volumes I & II, Tenth Edition» (Sun Microsystems Press, 2008)1, 
а также десятков других книг для профессиональных программистов 
и студентов факультетов информатики. Он является профессором 
информатики университета в Сан Хосе и обладателем звания Java 
Champion.

1 Хорстманн Кей С., Корнелл Г. Java 2. Библиотека профессионала. Основы. 
Т. 1. Вильямс, 2008. ISBN: 978-5-8459-1378-4; Хорстманн Кей С., Корнелл Г. 
Java 2. Библиотека профессионала. Расширенные средства программирования. Т. 2. Вильямс, 2015. ISBN: 978-5-8459-2031-7. – Прим. перев.