web-dev-qa-db-ja.com

Kotlin-リストフィルタリング内のリスト

私はそれらのデータクラスを持っています:

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

それを取得する別の方法はありますか?

7
Michael

データは不変であるため(これは良いことです)、フィルタリング中にデータをコピーする必要があります。 copyを使用して、拡張性を高めます。

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

これにはflatMapを使用できます。これはマップとして機能しますが、マップされたすべてのコレクションを1つにマージします。

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

.map内に新しいオブジェクトを作成することがそれを取得する唯一の方法だと思います。

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