Java: Стримы
2026-02-26 18:07 Diff

В разработке иногда встречается задача "выпрямления" вложенных списков, то есть создания одного плоского списка из списка списков или списка массивов. В стримах за это отвечает метод flatMap(), который работает как показано в коде ниже.

flatMap() работает как отображение map, которое применяет к каждому элементу стрима переданную лямбду. Эта лямбда преобразует каждый элемент, в нашем случае список чисел, в стрим. Когда все элементы преобразованы в стримы, выполняется вторая часть flatMap, стримы объединяются в один.

Особенно часто flatMap() встречается в работе с файловой системой при чтении списка файлов и директорий, а так же при работе с содержимым файлов. Ниже мы разберем подобный пример, но если он вам покажется слишком сложным, то не переживайте, просто пропустите его и вернитесь позже.

Для примера посчитаем частоту слов в файле. Для этого прочитаем файл с помощью File.lines(), этот метод возвращает стрим состоящий из строк файла. Именно здесь нам понадобится flatMap() для обработки каждой строки.

Это маленькая программа, но в ней происходит очень много всего сразу. Разберем ее построчно.

  • Конструкция try нужна для работы с такими ресурсами как файлы, она никак не влияет на нашу программу, поэтому не обращаем на нее внимание, она изучается позже.
  • Читается файл README.md построчно в переменную lines. Метод Files.lines возвращает Stream<String>.
  • Вызывается flatMap(), который преобразует набор строк в плоский список слов. Для этого внутри лямбды каждая строка разбивается на слова. Получившийся массив преобразуется в стрим с помощью Arrays.stream.
  • Все слова приводятся к нижнему регистру, на случай если они были написаны по-разному. Это называется нормализацией данных.
  • Выполняется группировка слов по частоте.