повторяемое скала#карты и типа Iterable#помощью flatMap
в чем разница между map
и flatMap
функции Iterable
?
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
поворачивает aList[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" - есть действительно хорошее объяснение этого там. (В основном это комбинация "сплющить" и "карта" -- функции из других языков).