От простых Stream Pipeline до проектирования современных систем обработки данных на Java.
💡 Не изучайте Stream API. Учитесь мыслить потоками данных.
Project Stream Forge — это практический курс по инженерному мышлению и современной обработке данных на Java.
Здесь Stream API выступает не целью обучения, а инструментом. Проект помогает перейти от использования отдельных методов стандартной библиотеки к проектированию выразительных конвейеров обработки данных, алгоритмов и архитектурных решений. Каждый уровень последовательно развивает способность мыслить декларативно, анализировать данные и выбирать оптимальные подходы к решению задач.
Вместо набора изолированных упражнений Stream Forge предлагает последовательную образовательную траекторию, где каждый новый уровень расширяет не только набор используемых инструментов, но и способ мышления разработчика.
Во время прохождения курса вы познакомитесь с современными подходами к обработке данных на Java:
✔ Java Stream API ✔ Collectors Framework ✔ Lambda Expressions ✔ Optional ✔ Comparator API
✔ Проектирование Stream Pipeline ✔ Многоуровневая агрегация данных ✔ Статистическая обработка ✔ Композиции Collector ✔ Оконные алгоритмы ✔ Жадные алгоритмы ✔ Обход графов (BFS) ✔ Коэффициент сходства Жаккара ✔ Гибридные алгоритмы
Большинство материалов по Stream API ограничиваются изучением отдельных методов: filter(), map(), flatMap(), collect().
Stream Forge предлагает другой подход.
Проект рассматривает Stream API как язык описания алгоритмов обработки данных. По мере прохождения курса вы переходите от простых преобразований коллекций к построению сложных конвейеров, аналитическим вычислениям и реализации алгоритмов, которые встречаются в реальных приложениях.
Каждый новый уровень не просто знакомит с очередным методом стандартной библиотеки, а развивает инженерное мышление: умение анализировать данные, выбирать оптимальный алгоритм и проектировать читаемые, масштабируемые решения.
В результате Stream API перестаёт восприниматься как набор отдельных операций и становится инструментом проектирования алгоритмов обработки данных.
Обычные задачники меряют сложность одним числом. Здесь их два, и они измеряют разное.
CODE — механика записи. Сколько конструкций Stream API нужно свинтить:
от filter до вложенного teeing и четырёхуровневого индекса.
MIND — мыслительная нагрузка. Свёртка восьми осей мышления:
| Ось | О чём |
|---|---|
| SET | работа с множествами |
| PAIR | пары и со-встречаемость |
| SEQ | последовательности, серии, окна |
| CTX | производный контекст: сначала посчитать, потом применить |
| JOIN | соединение источников |
| ALGO | проектирование алгоритмов |
| SYS | обобщённая машинерия, композиция коллекторов |
| PERF | рассуждение о вычислении |
Разница принципиальна. Задача может быть громоздкой в записи, но пустой
по мысли: построить пятиуровневый индекс механически несложно, просто
длинно. И наоборот — одна строка Collector-а способна стоить часа
размышлений.
Отсюда два слоя обучения:
Слой кода MIND = 0 механика качается, мысль спит
Слой мышления MIND > 0 механика на плато, качается мышление
Следствие, которое видно на данных: чистая механика упирается в потолок.
Написать по-настоящему сложный код, не начав думать, нельзя — конструкции
высшей сложности (кастомный Collector, конвейеры с промежуточными
структурами) неотделимы от мышления. Поэтому за верхом кодового слоя
ничего нет. Дальше — только мысль.
Ваш профиль по этим осям виден в ./hammerhall profile: где уже сильны,
где провал.
- 📚 360 практических задач первого набора, объединённых в единую траекторию;
- 🎓 десять ступеней: три в слое кода, семь в слое мышления;
- 🧩 единая предметная область вместо разрозненных учебных примеров;
- 🧪 автоматическая проверка через JUnit 5;
- 📈 постепенное усложнение алгоритмов;
- ⚙️ задачи, приближенные к промышленной обработке данных;
- 🧠 развитие алгоритмического мышления;
- 🚀 современные возможности Java 25+.
- Сделайте Fork репозитория.
- Клонируйте проект к себе.
- Создайте ветку
solution. - Откройте первую задачу и начните решать.
Подробное описание процесса разработки приведено в Forge Workflow.
Тест рядом с задачей — smoke-проверка. Он подтверждает, что решение собирается и что-то возвращает. Корректность он не проверяет: зелёный локальный тест не означает, что задача решена правильно.
Это сделано намеренно. Строгая проверка идёт на скрытом датасете, собранном так, чтобы вылавливать граничные случаи: пустые группы, ничьи при выборе максимума, дубликаты ключей, коллизии компараторов. Эти проверки вы не видите — иначе решать было бы нечего.
Отправьте решение через ./hammerhall submit, и оно прогонится
на закрытых тестах. Названия упавших подскажут, какой случай не учтён.
Пока не отправили — разбирайте сами. В каждой задаче спросите себя: что вернётся на пустом входе? что при ничьей? что при повторяющихся ключах? Умение задать эти вопросы до запуска тестов и есть навык, который здесь ставится.
В корне проекта лежит hammerhall — клиент кузницы. Устанавливать ничего
не нужно: он приезжает вместе с репозиторием.
./hammerhall loginКлиент попросит токен доступа. Токен выдаётся при регистрации на сайте и показывается один раз — сохраните его сразу. Потеряли — перевыпустите в личном кабинете: в базе хранится только отпечаток, восстановить исходный токен невозможно.
Токен сохранится в .hammerhall/config. Этот файл в .gitignore — он
не уедет в ваш форк.
./hammerhall submit MovCode0002.javaДостаточно имени файла: клиент сам найдёт его в src/main/java. Полный
путь тоже примет.
В ответ придёт вердикт:
✓ PASSED 10/10 тестов, 1007 мс
Или, если что-то не так:
✗ FAILED 3/10 тестов
Не прошли:
· пустой вход
· дубликаты ключей
Названия упавших тестов подсказывают, какой случай не учтён. Самих проверок вы не увидите — иначе решать было бы нечего.
./hammerhall profileПокажет ваш вектор по осям мышления: где уже сильны, где провал.
То же самое через hammerhall.bat:
hammerhall.bat submit MovCode0002.javaJava 25 — та же, на которой запускаются задачи. Больше ничего.
| Вердикт | Что означает |
|---|---|
PASSED |
решение верное, все проверки пройдены |
FAILED |
компилируется и работает, но отвечает неправильно |
STYLE_VIOLATION |
решение не в стрим-стиле — нет конвейера или использован цикл |
COMPILE_ERROR |
код не компилируется |
TIMEOUT |
решение работает слишком долго |
INVALID_INPUT |
решение отклонено до запуска |
STYLE_VIOLATION стоит до проверок: курс о Stream API, и правильный
ответ, полученный циклом, задачу курса не решает.
Stream Forge находится в активной разработке.
Новые задачи, улучшения и переработка существующих уровней публикуются регулярно.
Поэтому рекомендуется не скачивать проект архивом, а работать с ним через Git и периодически синхронизировать свой форк с оригинальным репозиторием.
Что именно изменилось в каждом обновлении — в CHANGELOG.md. Там же отмечено, когда менялись условия задач и закрытые тесты: если ваше решение проходило раньше, а теперь нет — скорее всего, причина там.
Подробный процесс работы описан в документе Forge Workflow.