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

问题描述 投票:0回答:6

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

android list kotlin android-recyclerview flatmap
6个回答
47
投票

我知道的最简单的一个是将

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]

22
投票

正如 @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
,使用
MutableList<Any>
创建一个
date
,然后在
addAll
块中创建
BB
also
项。可能有一种更优雅的方法来做到这一点,但这个方法是我先想到的。

简单地使用

flatten
在这里不起作用,因为AA没有实现
iterable


0
投票

您可以简单地尝试一下:

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

0
投票

我发现的扁平化列表的最佳方法:

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

0
投票

一年后,但这里有一些简单的例子:

带有列表的列表

val array = listOf(listOf("a", "b"), listOf("c", "b"))
.flatten().toTypedArray()

数组的数组

val array = arrayOf(arrayOf("a", "b"), arrayOf("c", "b"))
.flatten().toTypedArray()

带有数组列表

val array = listOf(arrayOf("a", "b"), arrayOf("c", "b"))
.flatMap { it.toList() }.toTypedArray()

希望能帮助别人。


0
投票

Iterable.flatMap 可用于展平结构:

data class Data(
    val list: List<Int>,
)
fun main() {
    val deepList: List<Data> = listOf(Data(listOf(1)), Data(listOf(2, 3)), Data(listOf(4, 5, 6)))
    val flatMap = deepList.flatMap { data: Data -> data.list }
    println(flatMap) // [1, 2, 3, 4, 5, 6]
}

它与 Iterable.flatten() 答案非常相似

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.