Scala для нетерпеливых
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Хорстманн Кей
Перевод:
Киселев Артём Николаевич
Год издания: 2020
Кол-во страниц: 414
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-97060-840-1
Артикул: 712488.02.99
Книга в сжатой форме описывает, что можно делать на языке Scala, и как это делать. Кей Хорстманн, автор всемирного бестселлера «Core Java», дает быстрое и практическое введение в язык программирования, основанное на примерах программного кода. Он знакомит читателя с концепциями языка Scala и приемами программирования небольшими «порциями», что позволяет быстро осваивать их и применять на практике. Практические примеры помогут вам пройти все стадии компетентности, от новичка до эксперта. Второе издание было обновлено до поддержки версии Scala 2.12 и демонстрирует самые современные приемы использования языка. В него было добавлено описание последних нововведений в Scala, включая интерполяцию строк, динамический вызов, неявные классы и объекты Future. Издание предназначено для программистов на Java, C++ и С#, которые желают освоить язык Scala и в целом функциональное программирование.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
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. – Прим. перев.