повторяемое скала#карты и типа Iterable#помощью flatMap


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

5 54

5 ответов:

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

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

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

- карты:
map [B](f : (A) => B) : List[B]

и flatMap-это

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)

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

с scaladoc:

  • карта

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

  • flatMap

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

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 -- список целых чисел, в данном случае.

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

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