Здесь есть три функции. map () , flatten () и flatMap () , который является комбинацией первых двух.
Рассмотрим следующий пример
data class Hero (val name:String)
data class Universe (val heroes: List<Hero>)
val batman = Hero("Bruce Wayne")
val wonderWoman = Hero (name = "Diana Prince")
val mailMan = Hero("Stan Lee")
val deadPool = Hero("Wade Winston Wilson")
val marvel = Universe(listOf(mailMan, deadPool))
val dc = Universe(listOf(batman, wonderWoman))
val allHeroes: List<Universe> = listOf(marvel, dc)
Карта
allHeroes.map { it.heroes }
// output: [[Hero(name=Stan Lee), Hero(name=Wade Winston Wilson)], [Hero(name=Bruce Wayne), Hero(name=Diana Prince)]]
Карта позволяет вам получить доступ к каждой вселенной в {allHeroes} и (в этом случае) вернуть
свой список героев. Таким образом, на выходе будет список, содержащий два списка героев,
один для каждой вселенной.
Результатом является Список>
Flatmap
allHeroes.flatMap { it.heroes }
// output: [Hero(name=Stan Lee), Hero(name=Wade Winston Wilson), Hero(name=Bruce Wayne), Hero(name=Diana Prince)]
FlatMap позволяет делать то же, что и карта, получить доступ к двум спискам героев из
обе вселенные. Но это идет дальше и сглаживает возвращенный список списков
в единый список.
Результатом является список
Сглаживание
allHeroes.map { it.heroes }.flatten()
// output: [Hero(name=Stan Lee), Hero(name=Wade Winston Wilson), Hero(name=Bruce Wayne), Hero(name=Diana Prince)]
Это дает тот же результат, что и flatMap.
Таким образом, flatMap представляет собой комбинацию двух функций, map {} и затем flatten ()