В большинстве случаев операции «map» и «flatMap» используются для функциональной генерации структур данных. Оба начинают с одной структуры данных, применяют некоторые операции к каждому элементу в ней и возвращают новую структуру данных той же формы, что и оригинал. Они отличаются только тем, как заполняется новая структура данных. Эти два настолько распространены и настолько мощны, что в Scala есть специальный синтаксис - для понимания - для их поддержки. Внешнее понимание выглядит внешне похожим на цикл for в стиле Java, но фактически компилируется в серию вызовов map и flatMap (среди нескольких других).
В функциональном программировании обычно разбивают вашу проблему на преобразования, подобные этим, из одной структуры данных в другую, а не в явном виде описывают шаги, необходимые для построения и уничтожения ваших структур данных. Это требует некоторого привыкания, особенно при определении структуры данных, с которой нужно начинать. Как только вы овладеете им, это чрезвычайно мощная техника, позволяющая четко, точно и четко выражать большие куски функциональности, и с небольшим пространством для ошибок.
Стоит также отметить, что «map» и «flatMap» на самом деле являются частными случаями другой, более мощной функции: «fold». "fold" (реализованный как "foldLeft" и "foldRight" по техническим причинам) может использоваться как для построения структур данных, так и для их разбивки.