[英]How to flatten List of Lists in Kotlin?
我有一個 AA 類對象列表,其中包含一個日期和一個 BB 類對象列表:
data class AA(
val date: LocalDate,
val bb: List<BB>
)
@Parcelize
data class BB(
val x: Int,
val y: String,
val z: String
) : Parcelable
我想創建一個如下所示的列表(展平List<AA>
):
listOf(
date obj
BB obj
BB obj
date obj
BB obj
date obj
BB obj
BB obj
BB obj)
代替:
listOf(
date obj, listOf(BB obj, BB obj)
date obj, listOf(BB obj)
date obj, listOf(BB obj, BB obj, BB obj))
我嘗試使用 flatMap,但我只設法壓平了一個部分 - BB。
如何創建包含日期和 BB 項目的列表?
我所知道的最簡單的方法是將flatten()
函數擴展到Iterable
。 由於List
是后者的子類,所以適用。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/flatten.html
val deepList = listOf(listOf(1), listOf(2, 3), listOf(4, 5, 6))
println(deepList.flatten()) // [1, 2, 3, 4, 5, 6]
正如@DYS所回答的那樣,您可以並且應該使用flatten
來展平列表。 我的回答涵蓋了如何實現問題中所述的特殊情況。
你可以這樣做:
val a = listOf(
AA(LocalDate.now(), listOf(BB(1, "1", "1")))
)
val flattened = a.flatMap { aa -> mutableListOf<Any>(aa.date).also { it.addAll(aa.bb) }}
查看完整示例
基本上你使用flatMap
,用date
創建一個MutableList<Any>
,然后在also
塊中addAll
BB
項目。 可能有一種更優雅的方法來做到這一點,但這是我首先想到的。
簡單地使用flatten
在這里不起作用,因為 AA 沒有實現iterable
。
你可以簡單地試試這個:
fun flatten(list: List<List<Any>>?) = list?.flatten() ?: emptyList()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.