scala Iterable # map против Iterable # flatMap - PullRequest
57 голосов
/ 29 июня 2009

В чем разница между функциями map и flatMap Iterable?

Ответы [ 5 ]

55 голосов
/ 30 июня 2009

Все вышесказанное верно, но есть еще одна удобная вещь: flatMap превращает List[Option[A]] в List[A], а любые Option, которые сверлят до None, удаляются. Это ключевой концептуальный прорыв для выхода за рамки использования null.

43 голосов
/ 30 июня 2009

Вот довольно хорошее объяснение:

http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

Использование списка в качестве примера:

Подпись карты:

map [B](f : (A) => B) : List[B]

и flatMap's

flatMap [B](f : (A) => Iterable[B]) : List[B]

Так что flatMap принимает тип [A] и возвращает повторяемый тип [B], а map принимает тип [A] и возвращает тип [B]

Это также даст вам представление о том, что flatmap «сгладит» списки.

val l  = List(List(1,2,3), List(2,3,4))

println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))

println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)
8 голосов
/ 30 июня 2009
lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words

Вы можете увидеть это лучше для понимания:

for {line <- lines
     word <- line split "\\W+"}
yield word.length

это означает:

lines.flatMap(line => line.split("\\W+").map(word => word.length))

Каждый итератор внутри for будет переведен в "flatMap", кроме последнего, который переведен в "map". Таким образом, вместо того, чтобы возвращать вложенные коллекции (список массива буфера бла, бла, бла), вы возвращаете плоскую коллекцию. Коллекция, состоящая из элементов yield'ed - в данном случае это список целых чисел.

8 голосов
/ 29 июня 2009

С скаладок :

  • карта

Возвращает повторяемый результат от применения данной функции F к каждый элемент этого повторяемого.

  • flatMap

Применяет данную функцию f к каждому элементу этой итерации, то объединяет результаты.

3 голосов
/ 29 июня 2009

Смотрите здесь: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

«Поиск flatMap» - там есть действительно хорошее объяснение. (В основном это комбинация «сглаживать» и «карта» - функции из других языков).

...