Современный язык Java. Лямбда-выражения, потоки и функциональное программирование - Рауль-Габриэль Урма - E-Book

Современный язык Java. Лямбда-выражения, потоки и функциональное программирование E-Book

Рауль-Габриэль Урма

0,0

Beschreibung

Преимущество современных приложений — в передовых решениях, включающих микросервисы, реактивные архитектуры и потоковую обработку данных. Лямбда-выражения, потоки данных и долгожданная система модулей платформы Java значительно упрощают их реализацию. Пришло время повысить свою квалификацию и встретить любой вызов во всеоружии! Книга поможет вам овладеть новыми возможностями современных дополнений, таких как API Streams и система модулей платформы Java. Откройте для себя новые подходы к конкурентности и узнайте, как концепции функциональности улучшают работу с кодом. В этой книге: •Новые возможности Java. •Потоковые данные и реактивное программирование. •Система модулей платформы Java.

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: 731

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.



Рауль-Габриэль Урма, Марио Фуско, Алан Майкрофт
Современный язык Java. Лямбда-выражения, потоки и функциональное программирование
2021

Научный редактор М. Матвеев

Переводчик И. Пальти

Технический редактор Н. Гринчик

Литературный редактор Н. Гринчик

Художники А. Барцевич, С. Заматевская

Корректоры Е. Павлович, Е. Рафалюк-Бузовская

Верстка О. Богданович, Н. Гринчик

Рауль-Габриэль Урма, Марио Фуско, Алан Майкрофт

Современный язык Java. Лямбда-выражения, потоки и функциональное программирование. — СПб.: Питер, 2021.

ISBN 978-5-4461-0997-5

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

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

Оглавление

Предисловие
Благодарности
Рауль-Габриэль Урма
Марио Фуско
Алан Майкрофт
Об этой книге
Структура издания
О коде
Форум для обсуждения книги
От издательства
Об авторах
Иллюстрация на обложке
Часть I. Основы
Глава 1. Java 8, 9, 10 и 11: что происходит?
1.1. Итак, о чем вообще речь?
1.2. Почему Java все еще меняется
1.3. Функции в Java
1.4. Потоки данных
1.5. Методы с реализацией по умолчанию и модули Java
1.6. Другие удачные идеи, заимствованные из функционального программирования
Резюме
Глава 2. Передача кода и параметризация поведения
2.1. Как адаптироваться к меняющимся требованиям
2.2. Параметризация поведения
2.3. Делаем код лаконичнее
2.4. Примеры из практики
Резюме
Глава 3. Лямбда-выражения
3.1. Главное о лямбда-выражениях
3.2. Где и как использовать лямбда-выражения
3.3. Практическое использование лямбда-выражений: паттерн охватывающего выполнения
3.4. Использование функциональных интерфейсов
3.5. Проверка типов, вывод типов и ограничения
3.6. Ссылки на методы
3.7. Практическое использование лямбда-выражений и ссылок на методы
3.8. Методы, удобные для композиции лямбда-выражений
3.9. Схожие математические идеи
Резюме
Часть II. Функциональное программирование с помощью потоков
Глава 4. Знакомство с потоками данных
4.1. Что такое потоки данных
4.2. Знакомимся с потоками данных
4.3. Потоки данных и коллекции
4.4. Потоковые операции
Резюме
Глава 5. Работа с потоками данных
5.1. Фильтрация
5.2. Срез потока данных
5.3. Отображение
5.4. Поиск и сопоставление с шаблоном
5.5. Свертка
5.6. Переходим к практике
5.7. Числовые потоки данных
5.8. Создание потоков данных
Резюме
Глава 6. Сбор данных с помощью потоков
6.1. Главное о коллекторах
6.2. Свертка и вычисление сводных показателей
6.3. Группировка
6.4. Секционирование
6.5. Интерфейс Collector
6.6. Разрабатываем собственный, более производительный коллектор
Резюме
Глава 7. Параллельная обработка данных и производительность
7.1. Параллельные потоки данных
7.2. Фреймворк ветвления-объединения
7.3. Интерфейс Spliterator
Резюме
Часть III. Эффективное программирование с помощью потоков и лямбда-выражений
Глава 8. Расширения Collection API
8.1. Фабрики коллекций
8.2. Работа со списками и множествами
8.3. Работа с ассоциативными массивами
8.4. Усовершенствованный класс ConcurrentHashMap
Резюме
Глава 9. Рефакторинг, тестирование и отладка
9.1. Рефакторинг с целью повышения удобочитаемости и гибкости кода
9.2. Рефакторинг объектно-ориентированных паттернов проектирования с помощью лямбда-выражений
9.3. Тестирование лямбда-выражений
9.4. Отладка
Резюме
Глава 10. Предметно-ориентированные языки и лямбда-выражения
10.1. Специальный язык для конкретной предметной области
10.2. Малые DSL в современных API Java
10.3. Паттерны и методики создания DSL на языке Java
10.4. Реальные примеры DSL Java 8
Резюме
Часть IV. Java на каждый день
Глава 11. Класс Optional как лучшая альтернатива null
11.1. Как смоделировать отсутствие значения
11.2. Знакомство с классом Optional
11.3. Паттерны для внедрения в базу кода опционалов
11.4. Примеры использования опционалов на практике
Резюме
Глава 12. Новый API для работы с датой и временем
12.1. Классы LocalDate, LocalTime, LocalDateTime, Instant, Duration и Period
12.2. Операции над датами, синтаксический разбор и форматирование дат
12.3. Различные часовые пояса и системы летоисчисления
Резюме
Глава 13. Методы с реализацией по умолчанию
13.1. Эволюция API
13.2. Коротко о методах с реализацией по умолчанию
13.3. Примеры использования методов с реализацией по умолчанию
13.4. Правила разрешения конфликтов
Резюме
Глава 14. Система модулей Java
14.1. Движущая сила появления системы модулей Java: размышления о ПО
14.2. Причины создания системы модулей Java
14.3. Модули Java: общая картина
14.4. Разработка приложения с помощью системы модулей Java
14.5. Работа с несколькими модулями
14.6. Компиляция и компоновка
14.7. Автоматические модули
14.8. Объявление модуля и выражения
14.9. Пример побольше и дополнительные источники информации
Резюме
Часть V. Расширенная конкурентность в языке Java
Глава 15. Основные концепции класса CompletableFuture и реактивное программирование
15.1. Эволюция поддержки конкурентности в Java
15.2. Синхронные и асинхронные API
15.3. Модель блоков и каналов
15.4. Реализация конкурентности с помощью класса CompletableFuture и комбинаторов
15.5. Публикация/подписка и реактивное программирование
15.6. Реактивные системы и реактивное программирование
Резюме
Глава 16. Класс CompletableFuture: композиция асинхронных компонентов
16.1. Простые применения фьючерсов
16.2. Реализация асинхронного API
16.3. Делаем код неблокирующим
16.4. Конвейерная организация асинхронных задач
16.5. Реагирование на завершение CompletableFuture
Резюме
Глава 17. Реактивное программирование
17.1. Манифест реактивности
17.2. Реактивные потоки данных и Flow API
17.3. Реактивная библиотека RxJava
Резюме
Часть VI. Функциональное программирование и эволюция языка Java
Глава 18. Мыслим функционально
18.1. Создание и сопровождение систем
18.2. Что такое функциональное программирование
18.3. Рекурсия и итерация
Резюме
Глава 19. Методики функционального программирования
19.1. Повсюду функции
19.2. Персистентные структуры данных
19.3. Отложенное вычисление с помощью потоков данных
19.4. Сопоставление с шаблоном
19.5. Разное
Резюме
Глава 20. Смесь ООП и ФП: сравнение Java и Scala
20.1. Введение в Scala
20.2. Функции
20.3. Классы и типажи
Резюме
Глава 21. Заключение и дальнейшие перспективы Java
21.1. Обзор возможностей Java 8
21.2. Система модулей Java 9
21.3. Вывод типов локальных переменных в Java 10
21.4. Что ждет Java в будущем?
21.5. Ускорение развития Java
21.6. Заключительное слово
Приложения
A. Прочие изменения языка
A.1. Аннотации
A.2. Обобщенный вывод целевых типов
Б. Прочие изменения в библиотеках
Б.1. Коллекции
Б.2. Конкурентность
Б.3. Массивы
Б.4. Классы Number и Math
Б.5. Класс Files
Б.6. Рефлексия
Б.7. Класс String
В. Параллельное выполнение нескольких операций над потоком данных
В.1. Ветвление потока данных
В.2. Вопросы производительности
Г. Лямбда-выражения и байт-код JVM
Г.1. Анонимные классы
Г.2. Генерация байт-кода
Г.3. Invokedynamic спешит на помощь
Г.4. Стратегии генерации кода

Предисловие

В 1998 году, когда мне было всего восемь лет, я открыл свою первую книгу по программированию — она была посвящена JavaScript и HTML. Я и не подозревал, что это простое действие перевернет всю мою жизнь — я открыл для себя мир языков программирования и всех тех потрясающих вещей, которые можно сделать с их помощью. Я попался на крючок. Время от времени я по-прежнему узнаю о новых возможностях языков программирования, которые воскрешают во мне то чувство восхищения, поскольку позволяют писать более аккуратный и лаконичный код, причем вдвое быстрее. Надеюсь, обсуждаемые в данной книге нововведения Java версий 8, 9 и 10, привнесенные из функционального программирования, будут так же вдохновлять вас.

Наверное, вам интересно, как появилась эта книга вообще и второе ее издание в частности?

Что ж, в 2011 году Брайан Гётц (Brian Goetz) — архитектор языка Java в Oracle — публиковал различные предложения по добавлению лямбда-выражений в Java, желая вовлечь в этот процесс сообщество разработчиков. Они вновь разожгли мой интерес, и я начал продвигать эти идеи, организуя семинары по Java 8 на различных конференциях разработчиков, а также читать лекции студентам Кембриджского университета.

К апрелю 2013 года мой издатель из Manning прислал мне по электронной почте письмо, где спросил, не хочу ли я написать книгу о лямбда-выражениях в Java 8. На тот момент я был всего лишь скромным соискателем степени PhD на втором году обучения, и это предложение показалось мне несвоевременным, поскольку могло негативно отразиться на моем графике подачи диссертации. С другой стороны, carpe diem1. Мне казалось, что написание небольшой книги требует не так уж много времени (и только позднее я понял, как сильно ошибался!). В итоге я обратился за советом к своему научному руководителю профессору Алану Майкрофту (Alan Mycroft), который, как оказалось, был не против поддержать меня в такой авантюре (даже предложил помочь с этой не относящейся к моей диссертации работой, за что я навеки его должник). А несколько дней спустя мы встретили знакомого евангелиста Java 8 Марио Фуско (Mario Fusco), обладавшего богатым опытом и хорошо известного своими докладами по функциональному программированию на крупных конференциях разработчиков.

Мы быстро поняли, что, объединив наши усилия и столь разнородный опыт, можем написать не просто небольшую книгу по лямбда-выражениям Java 8, а книгу, которая, надеемся, будет полезной сообществу Java-разработчиков и через пять и даже десять лет. У нас появилась уникальная возможность подробно обсудить множество вопросов, важных для Java-разработчиков, и распахнуть двери в совершенно новую вселенную: функциональное программирование.

Наступил 2018 год, и оказалось, что было продано 20 000 экземпляров первого издания, версия Java 9 только появилась, вот-вот должна была появиться версия Java 10, и время притупило воспоминания о множестве долгих ночей редактирования книги. Итак, вот оно — второе издание «Современного языка Java», охватыва­ющее Java 8, Java 9 и Java 10! Надеемся, оно вам понравится!

 

Рауль-Габриэль Урма (Raoul-Gabriel Urma),

Cambridge Spark

1В переводе с лат. «лови день». — Примеч. пер.

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

Эта книга не появилась бы на свет без поддержки множества замечательных людей, в числе которых:

• наши близкие друзья и просто люди, на добровольных началах дававшие ценные отзывы и предложения: Ричард Уолкер (Richard Walker), Ян Сагановски (Jan Saganowski), Брайан Гётц (Brian Goetz), Стюарт Маркс (Stuart Marks), Джем Редиф (Cem Redif), Пол Сандоз (Paul Sandoz), Стивен Колбурн (Stephen Colebourne), Иньиго Медиавилла (Íñigo Mediavilla), Аллабакш Асадулла (Allahbaksh Asadullah), Томаш Нуркевич (Tomasz Nurkiewicz) и Михаэль Мюллер (Michael Müller);

• участники программы раннего доступа от издательства Manning (MEAP), публиковавшие свои комментарии на онлайн-форуме автора;

• рецензенты, дававшие полезные отзывы во время написания книги: Антонио Маньяни (Antonio Magnaghi), Брент Стэйнз (Brent Stains), Франциска Мейер (Franziska Meyer), Фуркан Камачи (Furkan Kamachi), Джейсон Ли (Jason Lee), Джорн Динкла (Jörn Dinkla), Лочана Меникараччи (Lochana Menikarachchi), Маюр Патил (Mayur Patil), Николаос Кайнтанцис (Nikolaos Kaintantzis), Симоне Борде (Simone Bordet), Стив Роджерс (Steve Rogers), Уилл Хейворт (Will Hayworth) и Уильям Уилер (William Wheeler);

• Кевин Харрельд (Kevin Harreld) — наш редактор-консультант из издательства Manning, терпеливо отвечавший на все наши вопросы и решавший наши проблемы. Он подробно консультировал нас при написании книги и вообще поддерживал, как только мог;

• Дэннис Селинджер (Dennis Selinger) и Жан-Франсуа Морен (Jean-François Morin), вычитавшие рукопись перед сдачей в верстку, а также Эл Шерер (Al Scherer), консультировавший нас по техническим вопросам во время работы над книгой.

Рауль-Габриэль Урма

Прежде всего я хотел бы поблагодарить родителей за их бесконечную любовь и поддержку на протяжении всей моей жизни. Моя маленькая мечта о написании книги стала реальностью! Кроме того, хотелось бы выразить бесконечную признательность Алану Майкрофту, моему соавтору и научному руководителю, за его доверие и поддержку. Хотел бы также поблагодарить моего соавтора Марио Фуско, разделившего со мной это приключение. Наконец, спасибо моим друзьям и наставникам за их полезные советы и моральную поддержку: Софии Дроссопулу (Sophia Drossopoulou), Эйдену Рошу (Aidan Roche), Алексу Бакли (Alex Buckley), Хаади Джабадо (Haadi Jabado) и Гаспару Робертсону (Jaspar Robertson). Вы крутые!

Марио Фуско

Я хотел бы в первую очередь поблагодарить свою жену Марилену, благодаря безграничному терпению которой мне удалось сосредоточиться на написании этой книги, и нашу дочь Софию, поскольку создаваемый ею бесконечный хаос помогал мне творчески отвлекаться от книги. Как вы узнаете во время чтения, София преподала нам один урок — о различиях между внутренней и внешней итерацией, — как это может сделать только двухлетняя девочка. Хотел бы также поблагодарить Рауля-Габриэля Урму и Алана Майкрофта, с которыми я разделил (большую) радость и (маленькие) огорчения от написания этой книги.

Алан Майкрофт

Я хотел бы выразить благодарность моей жене Хилари и остальным членам моей семьи, терпеливо выносившим мою постоянную занятость. Я хотел бы также поблагодарить своих коллег и студентов, которые на протяжении многих лет учили меня, как нужно учить, Марио и Рауля за эффективное соавторство и, в частности, Рауля — за умение столь обходительно требовать «следующий кусочек текста к пятнице».

Об этой книге

Грубо говоря, появление новых возможностей Java 8 вместе с менее явными изменениями в Java 9 — самые масштабные изменения в языке Java за 21 год, прошедший с момента выпуска Java 1.0. Ничего не было удалено, так что весь существующий код на Java сохранит работоспособность, но новые возможности предлагают мощные новые идиомы и паттерны проектирования, благодаря которым код становится чище и лаконичнее. Сначала у вас может возникнуть мысль: «Ну зачем они опять меняют мой язык?» Но потом, после начала работы с новыми функциями, вы обнаружите, что благодаря им пишете более краткий и чистый код вдвое быстрее, чем раньше, — и осознаете, что уже не хотите возвращаться к «старому Java».

Второе издание этой книги, «Современный язык Java. Лямбда-выражения, потоки и функциональное программирование», рассчитано на то, чтобы помочь вам преодолеть этап «в принципе, звучит неплохо, но все такое новое и непривычное» и начать ориентироваться в новых функциях как рыба в воде.

«Может, и так, — наверное, думаете вы, — но разве лямбды и функциональное программирование не из того разряда вещей, о которых бородатые теоретики рассуждают в своих башнях из слоновой кости?» Возможно, но в Java 8 преду­смотрен ровно такой баланс идей, чтобы извлечь выгоду способами, понятными обычному Java-программисту. И эта книга как раз описывает Java с точки зрения обычного программиста, лишь с редкими отступлениями в стиле «Откуда это взялось?».

«“Лямбда-выражения” — звучит как какая-то тарабарщина!» Да, но они позволяют писать лаконичные программы на языке Java. Многие из вас сталкивались с обработчиками событий и функциями обратного вызова: когда регистрируется объект, содержащий метод, который должен вызываться в случае какого-либо события. Лямбда-выражения значительно расширяют сферу использования подобных функций в Java. Попросту говоря, лямбда-выражения и их спутники — ссылки на методы — обеспечивают возможность максимально лаконичной их передачи в качестве аргументов для выполнения кода или методов без отрыва от какой-либо совершенно иной деятельности. В книге вы увидите, что эта идея встречается гораздо чаще, чем вы могли себе представить: от простой параметризации метода сортировки кодом для сравнения и до сложных запросов к коллекциям данных с помощью новых Stream API (API обработки потоков данных).

«Потоки данных — что это такое?» Это замечательная новая возможность Java 8. Потоки ведут себя подобно коллекциям, но обладают несколькими преимуществами перед последними, позволяя использовать новые стили программирования. Во-первых, если вам доводилось программировать на языках запросов баз данных, например SQL, то вы знаете, что они позволяют описывать запросы несколькими строками вместо множества строк на Java. Поддержка потоков данных в Java 8 дает возможность использовать подобный сжатый код в стиле запросов баз данных — но с синтаксисом Java и без необходимости каких-либо знаний о базах данных! Во-вторых, потоки устроены так, что их данные не обязательно должны находиться в памяти (или даже обрабатываться) одновременно. А значит, появляется возможность обработки потоков данных настолько больших, что они не помещаются в памяти компьютера. Кроме того, Java 8 умеет оптимизировать операции над потоками данных лучше, чем операции над коллекциями: например, может группировать несколько операций над одним потоком так, что данные требуется обходить только один раз, а не несколько. Более того, Java может авто­матически параллелизовать потоковые операции (в отличие от операций над коллекциями).

«А функциональное программирование? Что это такое?» Это еще один стиль программирования, как и объектно-ориентированное программирование, но ориентированный на применение функций в качестве значений, как мы упоминали выше, говоря про лямбда-выражения.

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

И да, помимо этих функциональных возможностей, основанных на глобальных концептуальных новшествах в Java, мы расскажем о множестве других удобных функций и новинок Java 8, например о методах с реализацией по умолчанию, новых классах Optional и CompletableFuture, а также о новом API для работы с датой и временем (Date and Time API).

Вдобавок Java 9 привносит еще несколько новшеств: новую систему модулей, поддержку реактивного программирования с помощью Flow API и другие разно­образные усовершенствования.

Но погодите, это же только введение, дальнейшие подробности вы узнаете из самой книги.

Структура издания

Книга делится на шесть частей: «Основы», «Функциональное программирование с помощью потоков», «Эффективное программирование с помощью потоков и лямбда-выражений», «Java на каждый день», «Расширенная конкурентность в языке Java» и «Функциональное программирование и эволюция языка Java». Мы настоя­тельно советуем вам прочитать сначала главы из первых двух частей (причем по порядку, поскольку многие из обсуждаемых понятий основываются на материале предыдущих глав), оставшиеся же четыре части можно читать относительно независимо друг от друга. В большинстве глав есть несколько контрольных заданий для лучшего усвоения вами материала.

В первой части книги приводятся основные сведения, необходимые для знакомства с новыми идеями, появившимися в Java 8. К концу первой части вы будете знать, что такое лямбда-выражения, и научитесь писать код, лаконичный и в то же время достаточно гибкий для адаптации к меняющимся требованиям.

• В главе 1 мы резюмируем основные изменения в Java (лямбда-выражения, ссылки на методы, потоки данных и методы с реализацией по умолчанию) и подготовим фундамент для остальной части книги.

• Из главы 2 вы узнаете о параметризации поведения — важном для Java 8 паттерне разработки программного обеспечения, лежащем в основе лямбда-выражений.

• Глава 3 подробно объясняет понятия лямбда-выражений и ссылок на методы, здесь приводятся примеры кода и контрольные задания.

Вторая часть книги представляет собой углубленное исследование нового Stream API, позволяющего писать мощный код для декларативной обработки коллекций данных. К концу второй части вы полностью разберетесь, что такое потоки данных и как их использовать в своем коде для лаконичной и эффективной обработки коллекций данных.

• В главе 4 вы познакомитесь с понятием потока данных и увидите, чем он отличается от коллекции.

• Глава 5 подробно описывает потоковые операции, с помощью которых можно выражать сложные запросы для обработки данных. Вы встретите в ней множество паттернов, касающихся фильтрации, срезов, сопоставления с шаблоном, отображения и свертки.

• Глава 6 посвящена сборщикам данных — функциональной возможности Stream API, с помощью которой можно выражать еще более сложные запросы для обработки данных.

• Из главы 7 вы узнаете, как организовать автоматическое распараллеливание потоков данных и в полной мере использовать многоядерную архитектуру своей машины. Кроме того, мы расскажем вам, как избежать многочисленных подвод­ных камней и применять параллельные потоки правильно и эффективно.

В третьей части книги рассмотрены различные функции Java 8 и Java 9, которые помогут вам эффективнее использовать язык и обогатить вашу базу кода современными идиомами. Поскольку мы нацелены на использование более продвинутых концепций программирования, то для понимания изложенного далее в книге материала не требуется знаний этих методик.

• Глава 8 написана специально для второго издания, в ней мы изучаем коллекцию API дополнений (Collection API Enhancements) Java 8 и Java 9. Глава охватывает вопросы использования фабрик коллекции и новых идиоматических паттернов для работы со списками и множествами (коллекциями List и Set), а также идио­матических паттернов для ассоциативных массивов (коллекций Map).

• Глава 9 посвящена вопросам усовершенствования существующего кода с помощью новых возможностей Java 8 и включает несколько полезных примеров. Кроме того, в ней мы исследуем такие жизненно важные методики разработки программного обеспечения, как применение паттернов проектирования, рефакторинг, тестирование и отладка.

• Глава 10 также написана специально для второго издания. В ней обсуждается использование API на основе предметно-ориентированного языка (DSL). Это многообещающий метод проектирования API, популярность которого неуклонно растет. Его уже можно встретить в таких интерфейсах Java, как Comparator, Stream и Collector.

Четвертая часть книги посвящена различным новым возможностям Java 8 и Java 9, касающимся упрощения написания кода и повышения его надежности. Мы начнем с двух API, появившихся в Java 8.

• В главе 11 описывается класс java.util.Optional, позволяющий проектировать более совершенные API, а заодно и снизить количество исключений, связанных с указателями на null.

• Глава 12 посвящена изучению Date and Time API (API даты и времени), который существенно лучше предыдущих API для работы с датами/временем, подверженных частым ошибкам.

• В главе 13 вы прочитаете, что такое методы с реализацией по умолчанию, как развивать с их помощью API с сохранением совместимости, а также познакомитесь с некоторыми паттернами и узнаете правила эффективного использования методов с реализацией по умолчанию.

• Глава 14 написана специально для второго издания, в ней изучается система модулей Java — масштабное нововведение Java 9, позволяющее разбивать огромные системы на хорошо документированные модули вместо «беспорядочного набора пакетов».

В пятой части книги исследуются способы структурирования параллельных программ на языке Java — более продвинутые, чем простая параллельная обработка потоков данных, с которой вы к тому времени уже познакомитесь в главах 6 и 7.

• Глава 15 появилась во втором издании и демонстрирует идею асинхронных API «с высоты птичьего полета» — включая понятие будущего (Future) и протокол публикации-подписки (Publish-Subscribe), лежащий в основе реактивного программирования и включенный в Flow API Java 9.

• Глава 16 посвящена классу CompletableFuture, с помощью которого можно выражать сложные асинхронные вычисления декларативным образом — аналогично Stream API.

• Глава 17 тоже появилась только во втором издании, в ней подробно изучается Flow API Java 9 с упором на пригодный для практического использования реактивный код.

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

• Глава 18 предлагает полное руководство по функциональному программированию, знакомит с его терминологией и объясняет, как писать программы в функциональном стиле на языке Java.

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

• Глава 20 продолжает тему сравнения возможностей Java 8 с возможностями языка Scala — языка, который, как и Java, основан на использовании JVM. Scala быстро развивается, угрожая занять часть ниши Java в экосистеме языков программирования.

• В главе 21 мы еще раз обсудим наш путь изучения Java 8 и свою аргументацию в пользу функционального программирования. В дополнение мы поговорим о возможных будущих усовершенствованиях и замечательных новых возможностях Java, которые могут появиться после Java 8, Java 9 и небольших добавлений в Java 10.

Наконец, в книге есть четыре приложения, охватывающие несколько дополнительных тем, связанных с Java 8. В приложении A рассматриваются несколько небольших функций языка Java 8, которые не обсуждаются в основной части книги. В приложении Б приведен обзор остальных важных дополнений библиотеки Java, которые могут быть вам полезны. Приложение В продолжает часть II и посвящено продвинутым возможностям использования потоков данных. Приложение Г изучает вопросы реализации лямбда-выражений внутри компилятора Java.

О коде

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

Все примеры из книги и инструкции по их запуску доступны в репозитории GitHub (https://github.com/java-manning/modern-java), а также на сайте издателя по адресу http://www.manning.com/books/modern-java-in-action.

Форум для обсуждения книги

На странице https://forums.manning.com/forums/modern-java-in-action вы найдете информацию о том, как попасть на форум издательства Manning после регистрации. Там можно оставлять свои комментарии по поводу данной книги, задавать технические вопросы и получать помощь от авторов и других пользователей. Узнать больше о форумах издательства Manning и правилах поведения на них можно на странице https://forums.manning.com/forums/about.

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

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

Об авторах

 

Рауль-Габриэль Урма — генеральный директор и один из основателей компании Cambridge Spark (Великобритания), ведущего образовательного сообщества для исследователей данных и разработчиков. Рауль был избран одним из участников программы Java Champions в 2017 году. Он работал в компаниях Google, eBay, Oracle и Goldman Sachs. Защитил диссертацию по вычислительной технике в Кембриджском университете. Кроме того, он имеет диплом магистра технических наук Имперского колледжа Лондона, окончил его с отличием и получил несколько премий за рационализаторские предложения. Рауль представил более 100 технических докладов на международных конференциях.

 

Марио Фуско — старший инженер-разработчик программного обеспечения в компании Red Hat, участвующий в разработке ядра Drools — механизма обработки правил JBoss. Обладает богатым опытом разработки на языке Java, участвовал (зачастую в качестве ведущего разработчика) во множестве корпоративных проектов в различных отраслях промышленности, начиная от СМИ и заканчивая финансовым сектором. В числе его интересов функциональное программирование и предметно-ориентированные языки. На основе этих двух увлечений он создал библиотеку lambdaj с открытым исходным кодом, желая разработать внутренний DSL Java для работы с коллекциями и сделать возможным применение некоторых элементов функционального программирования в Java.

 

Алан Майкрофт — профессор на факультете компьютерных наук Кембриджского университета, где он преподает с 1984 года. Он также сотрудник колледжа Робинсона, один из основателей Европейской ассоциации языков и систем программирования, а также один из основателей и попечителей Raspberry Pi Foundation. Имеет ученые степени в области математики (Кембридж) и компьютерных наук (Эдинбург). Алан — автор более 100 научных статей. Был научным руководителем для более 20 кандидатов на соискание PhD. Его исследования в основном касаются сферы языков программирования и их семантики, оптимизации и реализации. Какое-то время он работал в AT&T Laboratories и научно-исследовательском отделе Intel, а также участвовал в основании компании Codemist Ltd., выпустившей компилятор языка C для архитектуры ARM под названием Norcroft.

Иллюстрация на обложке

Рисунок на обложке называется «Одеяния военного мандарина в Китайской Тартарии, 1700 г.». Одеяния мандарина причудливо разукрашены, он носит меч, а также лук и колчан со стрелами. Если присмотреться к его поясу, можно заметить там греческую букву «лямбда» (намек на один из рассматриваемых в этой книге вопросов), аккуратно добавленную нашим дизайнером. Эта иллюстрация позаимствована из четырехтомника Томаса Джеффериса (Thomas Jefferys) A Collection of the Dresses of Different Nations, Ancient and Modern («Коллекция платья разных народов, старинного и современного»), изданного в Лондоне в 1757–1772 годах. На титульном листе говорится, что это гравюра, раскрашенная вручную с применением гуммиарабика.

Томаса Джеффериса (1719–1771) называли географом при короле Георге III. Он был английским картографом и ведущим поставщиком карт своего времени. Он чертил и печатал карты для правительства и других государственных органов. На его счету целый ряд коммерческих карт и атласов, в основном Северной Америки. Занимаясь картографией в разных уголках мира, он интересовался местными традиционными нарядами, которые впоследствии были блестяще переданы в данной коллекции. В конце XVIII века заморские путешествия для собственного удовольствия были относительно новым явлением, поэтому подобные коллекции пользовались популярностью, позволяя получить представление о жителях других стран как настоящим туристам, так и «диванным» путешественникам.

Разнообразие иллюстраций в книгах Джеффериса — яркое свидетельство уникальности и оригинальности народов мира в то время. С тех пор тенденции в одежде сильно изменились, а региональные и национальные различия, такие значимые 200 лет назад, постепенно сошли на нет. В наши дни бывает сложно отличить друг от друга жителей разных континентов. Если взглянуть на это с оптимистической точки зрения, мы пожертвовали культурным и внешним разнообразием в угоду более насыщенной личной жизни или более разнообразной и интересной интеллектуальной и технической деятельности.

В то время как большинство компьютерных изданий мало чем отличаются друг от друга, компания Manning выбирает для своих книг обложки, основанные на богатом региональном разнообразии, которое Джефферис воплотил в иллюстрациях два столетия назад. Это ода находчивости и инициативности современной компьютерной индустрии.

Часть I. Основы

В первой части книги приводятся основы, необходимые для понимания новых идей, появившихся в Java 8. К концу первой части вы будете знать, что такое лямбда-выражения, и научитесь писать код, лаконичный и в то же время достаточно гибкий для адаптации к меняющимся требованиям.

• В главе 1 мы резюмируем основные изменения в Java (лямбда-выражения, ссылки на методы, потоки данных и методы с реализацией по умолчанию) и подготовим фундамент для материала, изложенного в остальной части книги.

• Из главы 2 вы узнаете о параметризации поведения — важном для Java 8 паттерне разработки программного обеспечения, лежащем в основе лямбда-выражений.

• Глава 3 подробно рассказывает про понятия лямбда-выражений и ссылок на методы, приводятся прмеры кода и контрольные задания.