Глава 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
Моделирование 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
Добавить комментарий