私はそれらのデータクラスを持っています:
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のリストをタイプでフィルタリングし、RouteItemのリストをIDでフィルタリングしたいと思います。
今の私のコード:
// 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]!! })
}
それを取得する別の方法はありますか?
データは不変であるため(これは良いことです)、フィルタリング中にデータをコピーする必要があります。 copy
を使用して、拡張性を高めます。
val result = routeTypes
.filter { it.type in filter.keys }
.map { it.copy(items = it.items.filter { it.id in filter[routeType.type]!! }) }
これにはflatMapを使用できます。これはマップとして機能しますが、マップされたすべてのコレクションを1つにマージします。
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]!! })
}