Лямбда-выражения в Java 8. Функциональное программирование — в массы
Покупка
Тематика:
Программирование на Java
Издательство:
ДМК Пресс
Автор:
Уорбэртон Ричард
Перевод:
Слинкин Алексей Александрович
Год издания: 2023
Кол-во страниц: 194
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Профессиональное образование
ISBN: 978-5-89818-337-0
Артикул: 816358.01.99
Если вы имеете опыт работы с Java SE, то из этой книги узнаете об изменениях в версии Java 8, обусловленных появлением в языке лямбда-выражений. Вашему вниманию будут представлены примеры кода, упражнения и увлекательные объяснения того, как можно использовать эти анонимные функции, чтобы сделать код проще и чище, и как библиотеки помогают в решении прикладных задач. Лямбда-выражения — относительно простое изменение в языке Java; в первой части книги показано, как правильно ими пользоваться. В последующих главах демонстрируется, как лямбда-выражения позволяют повысить производительность программы за счет распараллеливания, писать более простой конкурентный код и точнее моделировать предметную область, в том числе создавать более качественные предметно-ориентированные языки.
Издание предназначено для программистов разной квалификации, как правило уже работающих с Java, но не имеющих опыта функционального программирования.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование
- Программирование на Java
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Лямбда-выражения в Java 8 Ричард Уорбэртон
Java 8 Lambdas Functional Programming for the Masses Richard Warburton
Лямбда-выражения в Java 8 Функциональное программирование – в массы Москва, 2023 Ричард Уорбэртон 2-е издание, электронное
УДК 004.432.42Java 8 ББК 32.973.26-018.1 У62 У62 Уорбэртон, Ричард. Лямбда-выражения в Java 8. Функциональное программирование — в массы / Р. Уорбэртон ; пер. с англ. А. А. Слинкина. — 2-е изд., эл. — 1 файл pdf : 194 с. — Москва : ДМК Пресс, 2023. — (Функциональное программирование). — Систем. требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный. ISBN 978-5-89818-337-0 Если вы имеете опыт работы с Java SE, то из этой книги узнаете об изменениях в версии Java 8, обусловленных появлением в языке лямбда-выражений. Вашему вниманию будут представлены примеры кода, упражнения и увлекательные объяснения того, как можно использовать эти анонимные функции, чтобы сделать код проще и чище, и как библиотеки помогают в решении прикладных задач. Лямбда-выражения — относительно простое изменение в языке Java; в первой части книги показано, как правильно ими пользоваться. В последующих главах демонстрируется, как лямбда-выражения позволяют повысить производительность программы за счет распараллеливания, писать более простой конкурентный код и точнее моделировать предметную область, в том числе создавать более качественные предметно-ориентированные языки. Издание предназначено для программистов разной квалификации, как правило уже работающих с Java, но не имеющих опыта функционального программирования. УДК 004.432.42Java 8 ББК 32.973.26-018.1 Электронное издание на основе печатного издания: Лямбда-выражения в Java 8. Функциональное программирование — в массы / Р. Уорбэртон ; пер. с англ. А. А. Слинкина. — Москва : ДМК Пресс, 2014. — 192 с. — (Функциональное программирование). — ISBN 978-5-94074- 919-6. — Текст : непосредственный. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации. ISBN 978-5-89818-337-0 © 2014 Richard Warburton © Оформление, перевод, ДМК Пресс, 2014
Содержание Об авторе ............................................................................................................9 Предисловие..................................................................................................10 Глава 1. Введение ......................................................................................16 Зачем понадобилось снова изменять Java? ................................................16 Что такое функциональное программирование? ....................................18 Пример предметной области ...........................................................................18 Глава 2. Лямбда-выражения ............................................................20 Наше первое лямбда-выражение ...................................................................20 Как опознать лямбда-выражение ..................................................................21 Использование значений .................................................................................23 Функциональные интерфейсы .......................................................................24 Выведение типов .................................................................................................26 Основные моменты ............................................................................................29 Упражнения ..........................................................................................................29 Глава 3. Потоки ............................................................................................31 От внешнего итерирования к внутреннему ...............................................31 Что происходит на самом деле .......................................................................34 Наиболее распространенные потоковые операции ................................36 collect(toList()) .............................................................................................36 map ....................................................................................................................37 filter ...................................................................................................................38 flatMap .............................................................................................................39 max и min ........................................................................................................40 Проявляется общий принцип .................................................................41 reduce ...............................................................................................................43 Объединение операций .............................................................................44 Рефакторинг унаследованного кода .............................................................46 Несколько потоковых вызовов ......................................................................49 Функции высшего порядка .............................................................................50 Полезное применение лямбда-выражений ................................................51 Основные моменты ............................................................................................52
Содержание Упражнения ..........................................................................................................53 Упражнения повышенной сложности .........................................................54 Глава 4. Библиотеки ................................................................................55 Использование лямбда-выражений в программе ....................................55 Примитивы ............................................................................................................57 Разрешение перегрузки ....................................................................................59 Аннотация @FunctionalInterface ...................................................................61 Двоичная совместимость интерфейсов .......................................................62 Методы по умолчанию ......................................................................................63 Методы по умолчанию и наследование ...............................................64 Множественное наследование ........................................................................67 Три правила ...................................................................................................68 Компромиссы .......................................................................................................69 Статические методы в интерфейсах .............................................................70 Тип Optional ..........................................................................................................70 Основные моменты ............................................................................................72 Упражнения ..........................................................................................................72 Задача для исследования..................................................................................74 Глава 5. Еще о коллекциях и коллекторах ............................75 Ссылки на методы...............................................................................................75 Упорядочение элементов ..................................................................................76 Знакомство с интерфейсом Collector ...........................................................78 Порождение других коллекций ..............................................................79 Порождение других значений .................................................................80 Разбиение данных .......................................................................................81 Группировка данных ...................................................................................82 Строки .............................................................................................................83 Композиция коллекторов .........................................................................84 Рефакторинг и пользовательские коллекторы .................................86 Редукция как коллектор ...........................................................................94 Усовершенствование интерфейса коллекций ...........................................95 Основные моменты ............................................................................................96 Упражнения ..........................................................................................................97 Глава 6. Параллелизм по данным ................................................98 Параллелизм и конкурентность .....................................................................98 Почему параллелизм важен? ....................................................................... 100 Параллельные потоковые операции.......................................................... 101
Содержание 7 Моделирование ................................................................................................. 102 Подводные камни............................................................................................. 106 Производительность ....................................................................................... 107 Параллельные операции с массивами ...................................................... 110 Основные моменты ......................................................................................... 112 Упражнения ....................................................................................................... 113 Глава 7. Тестирование, отладка и рефакторинг ........... 114 Когда разумно перерабатывать код с использованием лямбда-выражений .......................................................................................... 114 Инкапсуляция внутреннего состояния ............................................ 115 Переопределение единственного метода ......................................... 116 Поведенческий паттерн «пиши все дважды».................................. 117 Автономное тестирование лямбда-выражений ..................................... 120 Использование лямбда-выражений в тестовых двойниках .............. 123 Отложенное вычисление и отладка ........................................................... 125 Протоколирование и печать ......................................................................... 125 Решение: метод peek ........................................................................................ 126 Точки останова в середине потока ............................................................. 127 Основные моменты ......................................................................................... 127 Глава 8. Проектирование и архитектурные принципы ....................................................................................................... 128 Паттерны проектирования и лямбда-выражения ................................ 129 Паттерн Команда ...................................................................................... 130 Паттерн Стратегия ................................................................................... 133 Паттерн Наблюдатель ............................................................................. 136 Паттерн Шаблонный метод .................................................................. 139 Предметно-ориентированные языки с поддержкой лямбда-выражений .......................................................................................... 143 Предметно-ориентированный язык на Java .................................... 144 Как это делается ........................................................................................ 145 Оценка .......................................................................................................... 148 Принципы SOLID и лямбда-выражения................................................. 148 Принцип единственной обязанности ................................................ 149 Принцип открытости-закрытости ...................................................... 152 Принцип инверсии зависимости......................................................... 155 Что еще почитать ............................................................................................. 159 Основные моменты ......................................................................................... 160
Содержание Глава 9. Конкурентное программирование и лямбда-выражения ........................................................................... 161 Зачем нужен неблокирующий ввод-вывод? ........................................... 161 Обратные вызовы ............................................................................................. 162 Архитектуры на основе передачи сообщений ........................................ 167 Пирамида судьбы ............................................................................................. 168 Будущие результаты ....................................................................................... 171 Завершаемые будущие результаты ............................................................ 173 Реактивное программирование ................................................................... 177 Когда и где .......................................................................................................... 180 Основные моменты ......................................................................................... 181 Упражнения ....................................................................................................... 181 Глава 10. Что дальше? ........................................................................ 183 Алфавитный указатель ...................................................................... 185
Об авторе Ричард Уорбэртон – технолог-эмпирик, увлекающийся решением сложных технических задач, требующих глубокого понимания предмета. Профессионально занимался проблемами статического анализа, верификацией части компилятора и разработкой усовершенствованной автоматизированной технологии обнаружения ошибок. Позже заинтересовался методами анализа данных для высокопроизводительных вычислений. Является руководителем лондонского сообщества пользователей Java и членом комитета JCP, организует процесс подачи запросов на улучшение для Java 8 в части лямбдавыражений и механизмов работы с датой и временем. Ричард также часто выступает на конференциях, в том числе JavaOne, DevoxxUK и JAX London. Получил степень доктора философии по информатике в Варвикском университете, где занимался теоретическими вопросами построения компиляторов.
Предисловие В течение многих лет функциональное программирование считалось уделом небольшой кучки специалистов, неизменно провозглашавших его превосходство, но не способных убедить массы в мудрости своего подхода. И эту книгу я написал прежде всего для того, чтобы оспорить идею о том, будто функциональному стилю присущи какоето особое превосходство и убежденность в том, что он доступен лишь немногим избранным. Последние два года я убеждал разработчиков, входящих в лондонское сообщество пользователей Java, попробовать те или иные аспекты Java 8. Как оказалось, многим членам нашего сообщества очень нравятся предоставленные им новые идиомы и библиотеки. Возможно, их несколько смущают терминология и элитарность технологии, но преимущества, которые несет с собой толика несложного функционального программирования, никого не оставляют равнодушными. Все согласны, что гораздо проще читать код манипуляции объектами и коллекциями, написанный с использованием нового Streams API, – например, для выделения музыкальных альбомов, выпущенных в Великобритании, из списка List всех альбомов. Из опыта проведения таких мероприятий я вынес важный урок – все зависит от примеров. Человек учится, решая простые примеры и осознавая стоящие за ними закономерности. Я также понял, что терминология легко может оттолкнуть учащегося, поэтому всегда стараюсь объяснять трудные идеи простыми словами. Для многих механизмы функционального программирования, включенные в Java 8, представляются невероятно ограниченными: ни тебе монад1, ни отложенных вычислений на уровне языка, ни дополнительной поддержки неизменяемости. С точки зрения программиста-прагматика, это прекрасно; нам нужна возможность выражать абстракции на уровне библиотек, чтобы можно быть писать простой и чистый код, решающий конкретную задачу. Даже лучше, если кто-то уже написал за нас эти библиотеки, чтобы мы могли сосредоточиться на своей повседневной работе. 1 Больше это слово в тексте ни разу не встретится.