Kotlin - List in the filter list

I have these data classes:

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>) 

I want to filter the RouteType list by type and list of RouteItem filters in it by id.

My code is:

 // 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]!! } } 

How to make a .map return list with a filtered list in it? Or maybe there is another way?

EDIT

Thank you, but flatmap not exactly what I need, I think. flatmap returns a nested list ( List<RouteItem> ), but I want List<RouteType> .

I got it by this code:

 val result = routeTypes .filter { it.type in filter.keys } .map { routeType -> RouteType( routeType.type, routeType.items.filter { it.id in filter[routeType.type]!! }) } 

Is there any other way to get it?

+5
source share
3 answers

Since your data is immutable (this is good), you need to copy it during filtering. Use copy to make it more extensible:

 val result = routeTypes .filter { it.type in filter.keys } .map { it.copy(items = it.items.filter { it.id in filter[routeType.type]!! }) } 
+8
source

You can use flatMap for this, it works like a map, but combines all your mapped collections into one:

 val result = routeTypes // List<RouteType> .filter { it.type in filter.keys } .flatMap { routeType -> routeType.items.filter { it.id in filter[routeType.type]!! } } 
+3
source

I believe creating a new object inside .map is the only way to get it.

 val result = routeTypes .filter { it.type in filter.keys } .map { routeType -> RouteType( routeType.type, routeType.items.filter { it.id in filter[routeType.type]!! }) } 
0
source

Source: https://habr.com/ru/post/1247074/


All Articles