Kotlin - 列表过滤中的列表

Posted

技术标签:

【中文标题】Kotlin - 列表过滤中的列表【英文标题】:Kotlin - List within a List filtering 【发布时间】:2016-08-05 03:32:32 【问题描述】:

我有那些数据类:

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&lt;RouteItem&gt;),但我想要List&lt;RouteType&gt;

我通过这段代码得到了它:

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

还有其他方法可以得到吗?

【问题讨论】:

flatMap() 是您要找的吗? 【参考方案1】:

由于您的数据是不可变的(这是一件好事),您需要在过滤时复制它。使用copy 使其更具可扩展性:

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

【讨论】:

欢迎您!不确定在任何地方都使用it。对我来说这里很好,但可以随意指定您认为合适的名称 这里是什么 "it" in lambdas: kotlinlang.org/docs/reference/…【参考方案2】:

您可以为此使用 flatMap,它可以用作地图,但会将所有映射的集合合并为一个:

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

【讨论】:

以上是关于Kotlin - 列表过滤中的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kotlin 就地过滤列表?

@Value 与来自 YAML 的 Kotlin 中的列表

Kotlin 中的 Python 列表、集合和映射推导等价物是啥?

Kotlin 用列表处理数据

从 Kotlin 中的列表或哈希映射数组列表中拆分字符串

在 Kotlin 中更改可变列表中的值