Kotlin - 列表过滤列表

时间:2016-04-13 20:06:54

标签: list lambda kotlin kotlin-android-extensions

我有这些数据类:

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

还有另一种方法可以获得吗?

3 个答案:

答案 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]!! })
            }