【问题标题】:Kotlin - List within a List filteringKotlin - 列表过滤中的列表
【发布时间】: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]!! })
                }

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

【问题讨论】:

标签: list lambda kotlin kotlin-android-extensions


【解决方案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。对我来说这里很好,但可以随意指定您认为合适的名称
  • 这里是什么
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多