如何在Kotlin中扁平化列表列表?

l3zydbqr  于 2022-12-04  发布在  Kotlin
关注(0)|答案(4)|浏览(179)

我有一个包含日期的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项的列表?

jgzswidk

jgzswidk1#

我知道的最简单的一个是Iterable的扩展flatten()函数,因为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]
qojgxg4l

qojgxg4l2#

正如@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块中创建BBaddAll项。可能有一个更优雅的方法来做这件事,但我首先想到了这个方法。
简单地使用flatten在这里不起作用,因为AA不实现iterable

3qpi33ja

3qpi33ja3#

您可以简单地尝试以下操作:

fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()
nxagd54h

nxagd54h4#

我发现的简化列表的最佳方法是:

val flatList = listOf<String>("A", "B", *listOf("C", "D").toTypedArray())

相关问题