如何展平 Kotlin 中的列表列表?
How to flatten List of Lists in Kotlin?
我有一个 class AA 的对象列表,其中包含一个日期和一个 class 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 项目的列表?
正如 you can and should use 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
块中创建 BB
的 addAll
项.可能有更优雅的方法,但我先想到了这个。
这里简单地使用flatten
是行不通的,因为AA没有实现iterable
.
我知道的最简单的方法是将 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]
你可以试试这个:
fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()
我有一个 class AA 的对象列表,其中包含一个日期和一个 class 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
回答的那样,将列表展平。我的回答包括如何实现问题中所述的特殊情况。
你可以这样做:
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
块中创建 BB
的 addAll
项.可能有更优雅的方法,但我先想到了这个。
这里简单地使用flatten
是行不通的,因为AA没有实现iterable
.
我知道的最简单的方法是将 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]
你可以试试这个:
fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()