如何在 Kotlin 中展平列表列表?

use*_*635 13 android list kotlin flatmap android-recyclerview

我有一个 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
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下所示的 List ( flatten List<AA>):

 listOf(
    date obj
    BB obj
    BB obj
    date obj
    BB obj
    date obj
    BB obj
    BB obj 
    BB obj)
Run Code Online (Sandbox Code Playgroud)

代替:

 listOf(
    date obj, listOf(BB obj, BB obj)
    date obj, listOf(BB obj)
    date obj, listOf(BB obj, BB obj, BB obj))
Run Code Online (Sandbox Code Playgroud)

我尝试使用 flatMap,但我只设法压平了一个部分 - BB。
如何创建包含日期和 BB 项目的列表?

DYS*_*DYS 20

我所知道的最简单的一个是扩展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]
Run Code Online (Sandbox Code Playgroud)

  • 您也可以这样做:“listOf(1) + listOf(2,3) + listOf(4,5,6)”(这是“listOf(1).plus(listOf(2,3))”的简写。 plus(listOf(4,5,6))`) 以获得相同的结果。 (2认同)

leo*_*mer 9

正如@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) }}
Run Code Online (Sandbox Code Playgroud)

查看完整示例

基本上你使用flatMap,创建一个MutableList<Any>date然后是块中的addAll项目。可能有一种更优雅的方法来做到这一点,但这是我首先想到的。BBalso

简单地使用flatten在这里不起作用,因为 AA 没有实现iterable.