我有这些数据类:
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>)
我想按类型过滤RouteType列表,并按ID过滤RouteItem列表。
我的代码现在:
// 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]!! }
}
如何使.map
返回包含已过滤列表的列表?或许还有另一种方式?
谢谢,但我认为flatmap
并不完全符合我的要求。 flatmap
返回嵌套列表(List<RouteItem>
),但我想要List<RouteType>
。
我通过这段代码得到了它:
val result = routeTypes
.filter { it.type in filter.keys }
.map {
routeType -> RouteType(
routeType.type,
routeType.items.filter { it.id in filter[routeType.type]!! })
}
还有另一种方法可以获得吗?
答案 0 :(得分:10)
由于您的数据是不可变的(这是一件好事),您需要在过滤时复制它。使用copy
使其更具可扩展性:
val result = routeTypes
.filter { it.type in filter.keys }
.map { it.copy(items = it.items.filter { it.id in filter[routeType.type]!! }) }
答案 1 :(得分:3)
您可以使用flatMap,它可以作为地图,但将所有映射的集合合并为一个:
val result = routeTypes // List<RouteType>
.filter { it.type in filter.keys }
.flatMap {
routeType -> routeType.items.filter { it.id in filter[routeType.type]!! }
}
答案 2 :(得分:0)
我想,在.map
中创建一个新对象是获得它的唯一方法。
val result = routeTypes
.filter { it.type in filter.keys }
.map {
routeType -> RouteType(
routeType.type,
routeType.items.filter { it.id in filter[routeType.type]!! })
}