Содержание курса
Факультативный модуль: Функциональная Java
21 урок
1.
Введение
↗
2.
Встроенные функциональные интерфейсы
↗
3.
Обзор операций
↗
4.
Методы map() и peek()
↗
5.
Класс Optional и «короткозамыкающие» операторы
↗
6.
Редукция и операторы преобразования данных
↗
7.
Утилитарный класс Collectors: обзор
↗
8.
Классификация с помощью groupingBy()
↗
9.
Бинарная сегментация с помощью partitioningBy()
↗
10.
Генераторы
↗
11.
Оператор flatMap()
↗
12.
Параллелизация стримов
↗
13.
Понятие statefulness
↗
14.
Параллельная редукция
↗
15.
Эксплуатационные хар-ки параллельных конвейеров
↗
16.
Практикум: лямбда-трейдеры
↗
17.
ЭКСТРА: Лямбда-нотация
↗
18.
ЭКСТРА: Каррированные функции
↗
19.
ЭКСТРА: Глубокое погружение в ссылки на методы – Часть 1
↗
20.
ЭКСТРА: Глубокое погружение в ссылки на методы – Часть 2
↗
21.
ЭКСТРА: Подробнее о методах интерфейса Function
↗
Асинхронная Java --- подмодуль CompletableFuture
23 урока
1.
Введение
↗
2.
Практика: старомодная Java и Future
↗
3.
Практика: CompletableFuture
↗
4.
Практика: несколько конвейеров
↗
5.
Практика: операция compose
↗
6.
Практика: операция combine
↗
7.
Практика: асинхронно, затем последовательно
↗
8.
Практика: асинхронно, затем параллельно
↗
9.
В каком смысле, "синхронно"?
↗
10.
Практика: найдем победителя забега
↗
11.
Практика: применим функцию с победителю
↗
12.
Операторы CompletableFuture: сводка
↗
13.
Обработка исключений через exceptionally()
↗
14.
Обработка исключений через handle()
↗
15.
Чекпойнты
↗
16.
Отмена (cancellation)
↗
17.
Завершение через completeExceptionally()
↗
18.
Завершение «вручную»
↗
19.
Завершение на Executor-пуле
↗
20.
Завершение на Executor-пуле по таймауту
↗
21.
Сходство и различия join() и get()
↗
22.
О кодовых базах к этому разделу
↗
23.
Заключение
↗
Асинхронная Java --- подмодуль NIO (неблокирующий ввод/вывод)
32 урока
1.
Освежаем в памяти: обзор базового функционала ввода/вывода
↗
2.
Практика: чтение/запись небольшого файла
↗
3.
Введение в NIO
↗
4.
Флагманские дата-типы NIO
↗
5.
Практика: работа с буфером
↗
6.
Практика: операция flip() на буфере
↗
7.
Практика: операция mark() на буфере
↗
8.
Что такое Channel
↗
9.
Практика: копирование через ченнел
↗
10.
Практика: передача данных через ченнел
↗
11.
Практика: ChannelServer и ChannelClient
↗
12.
Direct- и Mapped-буферы
↗
13.
Практика: чтение и запись файла через маппинг в память
↗
14.
Векторизация ввода/вывода
↗
15.
Практика: Scatter- и Gather-ченнелы
↗
16.
Интерфейс Selector
↗
17.
Практика: клиент-серверная связка с селектором
↗
18.
Пояснение: побитовый AND и численное продвижение
↗
19.
Практика: решение для клиент-серверной связки с селектором
↗
20.
Асинхронные ченнелы
↗
21.
Практика: AsyncFileChannel
↗
22.
Практика: AsyncFileHandler
↗
23.
Практика: AsyncClient
↗
24.
Практика: AsyncServer
↗
25.
Практика: AsyncToCompletableFuture
↗
26.
Расшаренная блокировка доступа к файлу
↗
27.
Практика: FileLock
↗
28.
IO и NIO: сводка
↗
29.
Практика: бенчмаркинг копирования
↗
30.
Знакомство с Netty
↗
31.
Практика: NettyClient и NettyServer
↗
32.
О кодовой базе к этому разделу
↗
Реактивная Java: Суть реактивной парадигмы
13 уроков
1.
Введение
↗
2.
О кодовой базе к этому разделу
↗
3.
Практика: Параллельные стримы
↗
4.
Практика: CompletableFuture
↗
5.
Практика: CompletableFuture с Executor-пулом
↗
6.
Асинхронность
↗
7.
Сходство и различия Rx и Stream
↗
8.
Reactive Stream Initiative
↗
9.
О регуляторах (противо)давления
↗
10.
«Реактивный манифест»
↗
11.
API реактивных стримов в Java
↗
12.
Практика: паттерн Observer
↗
13.
Заключение
↗
RxJava: Первое знакомство
35 уроков
1.
Введение
↗
2.
Практика: суммирование в функциональном и реактивном стилях
↗
3.
Observable допускает свое переиспользование!
↗
4.
Практика: неоднократно юзаем Observable
↗
5.
Практика: наблюдатель должен быть разным
↗
6.
И где тут Observer?
↗
7.
Работаем с командной строки
↗
8.
Практика: кеширование на Observable
↗
9.
Категории обзёрваблов
↗
10.
Практика: блокирующая подписка
↗
11.
Практика: неблокирующая подписка
↗
12.
Практика: «холодный» Observable
↗
13.
Практика: «горячий» Observable
↗
14.
Практика: OutOfMemoryError
↗
15.
Практика: Flowable без обработки противодавления
↗
16.
Практика: тривиальный сценарий обработки противодавления
↗
17.
Практика: утилизация (disposing)
↗
18.
Как создавать Observable
↗
19.
Практика: оператор create()
↗
20.
Классификация Rx-операторов
↗
21.
Практика: пребразователи
↗
22.
Практика: преобразование с небинарным селектором
↗
23.
Фильтрующие операторы
↗
24.
Практика: пример фильтрации
↗
25.
Комбинирующие операторы
↗
26.
Практика: комбинаторы
↗
27.
Практика: конвертация из ...
↗
28.
Практика: обработка исключений
↗
29.
Практика: жизненный цикл реактивного конвейера
↗
30.
Утилитарные операторы
↗
31.
Практика: применение утилит
↗
32.
Утилизация http-ресурса
↗
33.
Принципы работы условных и булевых операторов
↗
34.
Практика: Условные и булевые операторы
↗
35.
Противодавление и connectivity
↗
RxJava: Глубокое погружение
110 уроков
1.
Введение
↗
2.
Оператор just()
↗
3.
Разновидности источников
↗
4.
just() с маппером
↗
5.
Оператор interval()
↗
6.
Оператор create()
↗
7.
Оператор filter()
↗
8.
События наблюдателя
↗
9.
Оператор subscribe()
↗
10.
События жизенного цикла
↗
11.
Обработка исключений в функциональном стиле
↗
12.
Оператор doOnError()
↗
13.
Оператор onErrorReturn()
↗
14.
Оператор onErrorResume()
↗
15.
Оператор retry()
↗
16.
Оператор retryUntil()
↗
17.
Подробнее о «холодном» обзёрвабле
↗
18.
Подробнее о «горячем» обзёрвабле
↗
19.
«Холодный» обзёрвабл и sleep()
↗
20.
Оператор share()
↗
21.
Оператор connect()
↗
22.
Сходство и различия «горячего» и connectable-обзёрваблов
↗
23.
Оператор refCount()
↗
24.
Оператор autoConnect()
↗
25.
Фабрики обзёрваблов
↗
26.
Оператор defer()
↗
27.
Обзёрвабл категории Single
↗
28.
Обзёрвабл категории Maybe
↗
29.
Обзёрвабл категории Completable
↗
30.
Оператор onErrorComplete()
↗
31.
Подробнее про утилизацию (disposing)
↗
32.
Применение CompositeDisposable
↗
33.
Операторы-подавители
↗
34.
Операторы-преобразователи
↗
35.
Оператор delay()
↗
36.
Оператор scan()
↗
37.
Имплементируем «ползунок»
↗
38.
Оператор groupBy()
↗
39.
Оператор timestamp()
↗
40.
Операторы-редукторы
↗
41.
Операторы-коллекторы
↗
42.
Слияние
↗
43.
Конкатенация
↗
44.
И снова про flatMap()!
↗
45.
Зипперы
↗
46.
Оператор switchMap()
↗
47.
Оператор switchIfEmpty()
↗
48.
Оператор combineLatest()
↗
49.
Оператор replay() и класс ReplaySubject
↗
50.
Класс PublishSubject
↗
51.
Класс BehaviorSubject
↗
52.
Класс AsynchSubject
↗
53.
Класс UnicastSubject
↗
54.
«Подводные камни» Subject-конвейеров
↗
55.
Введение в Rx-многопоточность
↗
56.
Последовательное исполнение
↗
57.
Многопоточность через subscribeOn()
↗
58.
Поподробнее про blockingSubscribe() вместо Thread.sleep()
↗
59.
Знакомство с Scheduler-фабриками
↗
60.
Фабрика io()
↗
61.
Фабрика newThread()
↗
62.
Фабрика single()
↗
63.
Многопоточность на пользовательском Executor-пуле
↗
64.
Многопоточность с несколькими наблюдателями
↗
65.
Все на одном подпроцессе
↗
66.
Как проигнорировать subscribeOn()
↗
67.
Первый subscribeOn() побеждает
↗
68.
Знакомство с оператором observeOn()
↗
69.
observeOn() в действии
↗
70.
flatMap() и многопоточность
↗
71.
Оператор unsubscribeOn()
↗
72.
Буферизация
↗
73.
Наложение «окошек»
↗
74.
Дросселирование, выборка и устранение дребезга
↗
75.
Секундомер на операторе switchMap()
↗
76.
Как сгруппировать нажатия клавиш
↗
77.
Знакомство с Flowable
↗
78.
Для чего нужен Flowable
↗
79.
Flowable и Спецификация на реактивные конвейеры
↗
80.
Сходство и отличия Observable и Flowable
↗
81.
Интерфейс FlowableSubscriber
↗
82.
Стратегия противодавления Buffer
↗
83.
Стратегия противодавления Drop
↗
84.
Стратегия противодавления Latest
↗
85.
Конвертация Observable во Flowable
↗
86.
Генерация на Flowable
↗
87.
Генератор случайных чисел
↗
88.
Как реверснуть генерируемую последовательность на Flowable
↗
89.
Введение в реактивное тестирование
↗
90.
Тестируем blockingSubscribe()
↗
91.
Концепция блокирующих подписчиков
↗
92.
Оператор blockingFirst()
↗
93.
Оператор blockingLast()
↗
94.
Оператор blockingGet()
↗
95.
Оператор blockingIterable()
↗
96.
Оператор blockingForEach()
↗
97.
Оператор blockingNext()
↗
98.
Оператор blockingLatest()
↗
99.
Оператор blockingMostRecent()
↗
100.
Тестирование с TestObserver
↗
101.
Тестирование с TestScheduler
↗
102.
Отладочная демка
↗
103.
Подводим итоги
↗
104.
RxJava при смерти, или кому верить...
↗
105.
Предваряющее слово к самостоятельному практикуму
↗
106.
Решения задач из Практикума 1
↗
107.
Ответы на вопросы курсантов по Практикуму 1
↗
108.
Решения задач из Практикума 2
↗
109.
RxJava: подводим итоги обсуждения
↗
110.
RxJava: доп.примеры (будут пополняться по мере появления)
↗
Project Reactor
9 уроков
1.
Обзор библиотеки Reactor
↗
2.
Базовые приемы работы
↗
3.
Обработка противодавления в Reactor
↗
4.
Schedulers в Reactor
↗
5.
Параллельный Flux
↗
6.
Процессоры
↗
7.
Тестирование
↗
8.
Решение задач из Практикума
↗
9.
Reactor: подводим итоги обсуждения
↗
Spring-модуль WebFlux
13 уроков
1.
Знакомство с WebFlux
↗
2.
Практика с WebFlux
↗
3.
Знакомство с WebClient
↗
4.
Практика с WebClient
↗
5.
Подробнее о различиях между WebClient и RestTemplate
↗
6.
WebFlux и СУБД
↗
7.
Практика: WebFlux в связке с MongoDB --- Часть 1/2
↗
8.
Практика: WebFlux в связке с MongoDB --- Часть 2/2
↗
9.
Бенчмаркинг с WebFlux
↗
10.
Тестирование реактивных Spring-приложений
↗
11.
Простейший R2DBC-проект
↗
12.
WebFlux: подводим итоги обсуждения
↗
13.
Рекомендуемые практики создания реактивного кода и Заключение
↗
Бонусные лекции Reactive Extras
1 урок
1.
Реактивная имплементация брокера сообщений Kafka
↗
Факультативный модуль – Многопоточная Java
46 уроков
1.
Архитектура фон Неймана
↗
2.
Пользовательские процессы
↗
3.
Оценка потребного размера ОЗУ
↗
4.
Процессы и их роли
↗
5.
Сегменты памяти
↗
6.
Знакомство с подпроцессами (threads)
↗
7.
Подпроцессы пользователя и ОС
↗
8.
Сходства и отличия процессов и подпроцессов
↗
9.
Что может пойти не так
↗
10.
Мониторы
↗
11.
Синхронизирующие абстрации
↗
12.
Создание подпроцесса
↗
13.
Состояния подпроцесса
↗
14.
Приоритет подпроцесса
↗
15.
Метод join()
↗
16.
Метод interrupt()
↗
17.
Связка wait() и notify()
↗
18.
Ключевое слово volatile
↗
19.
Что стоит за volatile
↗
20.
Ключевое слово synchronized
↗
21.
Блоки синхронизации
↗
22.
Статическая блокировка (deadlock)
↗
23.
Счетчик с монитором
↗
24.
Интерфейс Lock
↗
25.
Класс ReentrantLock
↗
26.
Атомарный счетчик
↗
27.
Паттерн Producer-Consumer на связке wait/notify
↗
28.
С Новым годом! на связке wait/notify
↗
29.
Паттерн Producer-Consumer на связке Lock/Condition
↗
30.
ExecutorService с Runnable
↗
31.
ExecutorService с Semaphore
↗
32.
ExecutorService с Callable
↗
33.
ExecutorService и метод awaitTermination()
↗
34.
Класс CyclicBarrier
↗
35.
CyclicBarrier в действии
↗
36.
Фреймворк Fork/Join
↗
37.
Рекурсия: top-down и bottom-up
↗
38.
Рекурсия: пример доказательства по индукции
↗
39.
Рекурсивное вычисление площади
↗
40.
Простейший пример с Fork/Join
↗
41.
Бенчмаркинг суммирования на Fork/Join
↗
42.
ЭКСТРА: Concurrent, multithreaded и parallel
↗
43.
ЭКСТРА: Race Conditions и Data Races
↗
44.
ЭКСТРА: Состояние гонки в бинарных семафорах и мьютексах
↗
45.
ЭКСТРА: Liveness и синхронизация
↗
46.
ЭКСТРА: Знакомство с виртуальными подпроцессами
↗