Если вы уже знакомы с каким-либо языком программирования, вы, скорее всего, знаете и операторы циклов, таки, как for, однако в Scala "for" имеет несколько иной смысл, нежели в других языках, давайте разберёмся в чём именно различие?
For-comprehension - это синтаксический сахар языка, благодаря которому мы можем приводить сложные конструкции преобразования в приятный глазу облик, скажем так. Непонятно, согласен, посмотрим на примеры использования: возьмём два массива и переберём комбинации их содержимого.
val a = Array(1,2,3,4,5)
val b = Array(1,2,3,4,5)
val ab = for {
a1 <- a
b1 <- b
} yield (a1, b1)
Внутри ab мы получим массив с кортежами всех комбинаций из обоих массивов, выглядит довольно наглядно, не правда ли? Но что мы получим, если "десахаризируем" наш for-comprehension?
val ab = a
.flatMap((a1:Int) =>
b
.map(b1 => (a1, b1))
)
Уже знакомые нам функции map и flatMap, перебирающие массив и убирающие излишнюю вложенность. Функция делает то же самое, однако выглядит уже не так понятно, как в первом примере.
Однако больше мы любим for-comprehension, потому, что его можно, и даже нужно, применять в работе с монадами! Вот простой пример: возмём 3 Option'a с интовыми значениями, и преобразуем их внутри for - получим точно такой же Option, с изменёнными, необходимым образом, параметрами:
val a = Option(2)
val b = Option(3)
val c = Option(4)
val d: Option[Int] = for {
a1 <- a
b1 <- b
c1 <- c
}yield a1 * b1 * c1
Заметьте, на выходе - Option[Int], и если вдруг в какой-либо из монад отсутствует значение, точнее если она - None, то работа функции не выкинет ошибки и исключение, а вернёт такой же None. Таким образом мы можем безопасно обрабатывать любые значения, приходящие в тело функции.
Так же мы может добавлять внутреннюю логику внутрь for, например
a1 <- a if a1 > 0
Таким образом можно отсеять все отрицательные значения, например. И если в небольшом количестве переменных разница не столь видна, представьте, что у Вас не 3 монады или массива, а 6-10?
For-comprehension - ещё один повод радоваться тому, что ты пишешь на Scala ;)