Kotlin – List列表中的列表过滤

我有这些数据类:

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 Solutions collect form web for “Kotlin – List列表中的列表过滤”

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

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

您可以使用flatMap来作为map,但将所有映射的集合合并为一个:

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

我想,在.map创建一个新的对象是获得它的唯一方法。

 val result = routeTypes .filter { it.type in filter.keys } .map { routeType -> RouteType( routeType.type, routeType.items.filter { it.id in filter[routeType.type]!! }) } 
  • 在Kotlin中的Lambda表达式
  • 在lambda kotlin变通方法中的智能转换变量
  • 抽象类与Lambda参数
  • Java项目中Kotlin的高阶函数
  • java.lang.NoClassDefFoundError $$ intern $ forEach $ lambda $ 1在Kotlin中
  • Kotlin拓展函数的多态性
  • API 23(Marshmallow)的Android SDK是否支持Java 8?
  • Kotlin:安全的lambdas(没有内存泄漏)?
  • 将lambda存储在kotlin的变量中
  • 如何使用lambda表达式android替换匿名类
  • 如何在kotlin中编写含泛型的lambdas?
  • Kotlin language will be the best programming language for Android.