我有一个包含日期的 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
,使用 MutableList<Any>
创建一个 date
,然后在 addAll
块中创建 BB
的 also
项。可能有一种更优雅的方法来做到这一点,但这个方法是我先想到的。
简单地使用
flatten
在这里不起作用,因为AA没有实现iterable
。
您可以简单地尝试一下:
fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()
我发现的扁平化列表的最佳方法:
val flatList = listOf<String>("A", "B", *listOf("C", "D").toTypedArray())
一年后,但这里有一些简单的例子:
带有列表的列表
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()
希望能帮助别人。
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]
}