Kotlin – Lista dentro de un filter de list
Tengo esas classs de datos:
data class RouteType( @SerializedName("type") val type: String, @SerializedName("items") val items: List<RouteItem>) data class RouteItem( @SerializedName("id") val id: String, @SerializedName("route") private val route: List<DoubleArray>)
Deseo filtrar la list de RouteType por tipo y filtrar la list de RouteItem en ella por id.
- Cómo clonar o copyr una list en kotlin
- Obtener los elementos de una list de lists con la API de transmisión de Java en Kotlin
- Lista de sorting basada en el order de otra list
- Filtro de list dentro del range externo - KOTLIN
- Kotlin replace isEmpty () y last () con lastOrNull () dentro de una Collection
Mi código ahora:
// val filter: HashMap<String, List<String>> val result = routeTypes // List<RouteType> .filter { it.type in filter.keys } .map { routeType -> routeType.items.filter { it.id in filter[routeType.type]!! } }
¿Cómo hacer una list de retorno .map
con una list filtrada? O tal vez hay otra manera?
EDITAR
Gracias, pero flatmap
no es exactamente lo que necesito, creo. flatmap
devuelve una list anidada ( List<RouteItem>
), pero quiero List<RouteType>
.
Lo tengo por este código:
val result = routeTypes .filter { it.type in filter.keys } .map { routeType -> RouteType( routeType.type, routeType.items.filter { it.id in filter[routeType.type]!! }) }
¿Hay alguna otra forma de getlo?
- ¿Qué es una forma concisa de copyr profundamente una MutableList 2D?
- ¿Cómo crear una list inmutable en Kotlin que también sea una list inmutable en Java?
- ¿Cómo convierto un Char a Int?
- Listar files recursivamente en Kotlin
- Android Spinner getDropDownView repite elementos después de la selección
- Kotlin: creación de una list mutable con elementos repetitivos
- Kotlin prepone elemento
- En Kotlin, ¿cómo se modifican los contenidos de una list mientras se itera
Como sus datos son inmutables (eso es algo bueno), debe copyrlos durante el filtrado. Use copy
para hacerlo más extensible:
val result = routeTypes .filter { it.type in filter.keys } .map { it.copy(items = it.items.filter { it.id in filter[routeType.type]!! }) }
Puede usar flatMap para esto, funciona como un map, pero combina todas sus collections asignadas a una:
val result = routeTypes // List<RouteType> .filter { it.type in filter.keys } .flatMap { routeType -> routeType.items.filter { it.id in filter[routeType.type]!! } }
Supongo que la creación de un nuevo object dentro de .map
es la única forma de getlo.
val result = routeTypes .filter { it.type in filter.keys } .map { routeType -> RouteType( routeType.type, routeType.items.filter { it.id in filter[routeType.type]!! }) }