kotlin: flaten函数/与flatMap函数的区别

一,功能

flatten 函数主要应用于嵌套集合(如 List of List 或 Set of Set 等),
它会将嵌套集合中的所有元素合并到一个单一层次的集合中。

flatMap 不仅可以将嵌套集合扁平化,更重要的是它允许你对每个子集合应用一个映射函数来生成新的元素

二,例子

代码:

        //处理按钮点击事件
        binding.button3.setOnClickListener {
            val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5, 6), setOf(1, 2))
            println(numberSets.flatten())    //[1, 2, 3, 4, 5, 6, 1, 2]
            val deepArray = arrayOf(
                arrayOf("Name:"),
                arrayOf('D', 'a'),
                arrayOf('i', 's', 'y')
            )
            val list = deepArray.flatten()
            println("list: $list")     // [Name:, D, a, i, s, y]
        }

运行结果:

image

三,例子:flatten 函数只能用于直接嵌套的情况

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            val nestedList = listOf(listOf("a", "b"), listOf("c", "d"))
            val flattenedList = nestedList.flatten()
            println("flaten结果:$flattenedList") // ["a", "b", "c", "d"]

            val nestedList2 = listOf(listOf(listOf("a", "b"), listOf("c", "d")),listOf(listOf("e", "f"), listOf("g", "h")),)
            val flattenedList2 = nestedList2.flatten()
            println("flaten结果:$flattenedList2") // [[a, b], [c, d], [e, f], [g, h]]
        }

运行结果:

image

三,与flatmap的区别

flatten 函数只能用于直接嵌套的情况,亦即由Collection组成的Collection
对于间接嵌套的情况,例如一个由对象构成的Collection,每个对象包含一个Collection类型的属性,则需要用到flatMap函数

四,例子:

代码:多层嵌套的情况,可以做两次flatMap或

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            val nestedList2 = listOf(listOf(listOf("a", "b"), listOf("c", "d")),listOf(listOf("e", "f"), listOf("g", "h")),)
            val flattenedList2 = nestedList2.flatMap {
                it.flatMap { it }
            }
            println("flatMap结果:$flattenedList2") // [a, b, c, d, e, f, g, h]
            val flattenedList3 = nestedList2.map{it.flatMap { it }}.flatten()
            println("map结果:$flattenedList3")    // [a, b, c, d, e, f, g, h]
            val flattenedList4 = nestedList2.flatMap {
                it.flatten()
            }
            println("flaten结果:$flattenedList4") // [a, b, c, d, e, f, g, h]
        }

运行结果:

image

五,flatMap的例子

代码:

        //处理按钮点击事件
        binding.button3.setOnClickListener {
            val lists = listOf(listOf("hello"), listOf("world"))
            val chars = lists.flatMap {
                it.flatMap {
                    it.toList()
                }
            }
            println("拆分后字符:$chars")   //[h, e, l, l, o, w, o, r, l, d]
            val lists2 = listOf(listOf("hello","java"), listOf("world","php"))
            val chars2 = lists2.flatMap { it.flatMap { it.toList() } }
            println("拆分后字符:$chars2")
            //[h, e, l, l, o, j, a, v, a, w, o, r, l, d, p, h, p]
        }

运行结果:

image

六,flatMap的例子

代码:

        //处理按钮点击事件
        binding.button4.setOnClickListener {
            val sentences = listOf(
                "Kotlin is great",
                "FlatMap is powerful",
                "I love learning Kotlin"
            )
            val words = sentences.flatMap { it.split(" ") }
            println("单词列表:$words")
        }

运行结果:

image

七,flatMap的例子

代码:

        //处理按钮点击事件
        binding.button5.setOnClickListener {
                val books = listOf(
                    Book("Kotlin in Action", listOf("Dmitry Jemerov", "Svetlana Isakova")),
                    Book("Effective Java", listOf("Joshua Bloch")),
                    Book("Clean Code", listOf("Robert C. Martin")),
                    Book("Refactoring", listOf("Martin Fowler", "Kent Beck"))
                )
                val authors = books.flatMap { it.authors }.distinct()
                println("作者列表:$authors")
        }

运行结果:

image

posted @ 2025-08-16 10:13  刘宏缔的架构森林  阅读(9)  评论(0)    收藏  举报