Kotlin 中的 `flatMap` 方法详解

news2024/9/20 0:25:18

在这里插入图片描述

在 Kotlin 中,flatMap 是一个非常强大的集合操作函数,它结合了 mapflatten 的功能。flatMap 能够将一个集合中的每个元素映射为另一个集合,然后将这些集合连接成一个单一的集合。在很多场景下,它比单独使用 mapflatten 更加高效、简洁。

什么是 flatMap

flatMap 是一种将嵌套集合“展平”的操作。简单来说,flatMap 会对集合中的每个元素执行一个映射操作,并返回一个新的集合,然后它会将所有这些子集合合并成一个集合。

语法

fun <T, R> Iterable<T>.flatMap(
   transform: (T) -> Iterable<R>
): List<R>
  • T 表示原集合中的元素类型
  • R 表示映射后元素的类型
  • transform 是一个 lambda 表达式,用来定义如何将 T 映射为 Iterable<R>(即子集合)
  • 返回的结果是一个 List<R>,这是合并后的集合

举个例子 😎

假设我们有一个包含字符串列表的集合,字符串本身是用空格分隔的单词。我们希望将每个字符串转换为单词列表,并将所有单词合并到一个集合中。这时 flatMap 就派上用场了!

fun main() {
    val sentences = listOf(
        "Kotlin is great",
        "FlatMap is powerful",
        "I love learning Kotlin"
    )

    val words = sentences.flatMap { it.split(" ") }

    println(words)
}

输出结果

[Kotlin, is, great, FlatMap, is, powerful, I, love, learning, Kotlin]

在这个例子中,flatMap 将每个句子分割成单词列表,并将它们“展平”为一个统一的单词列表。

flatMap vs map 🧐

我们可能会问,为什么不能直接用 map?其实 map 只能返回一个新的集合,而 flatMap 可以把每个集合中的子集合都“拍扁”,形成一个大集合。如果我们使用 map 来做同样的操作,结果会是嵌套的集合:

val mappedWords = sentences.map { it.split(" ") }

println(mappedWords)

输出结果

[[Kotlin, is, great], [FlatMap, is, powerful], [I, love, learning, Kotlin]]

可以看到,map 只是返回了嵌套的列表,而没有展平它们。如果我们需要将多个列表合并为一个大列表,那么 flatMap 是更好的选择。

更复杂的例子 🧑‍💻

现在我们来看看一个稍微复杂一点的例子。假设我们有一个包含多个学生及其课程的列表,每个学生有一个他们所选课程的列表。我们希望提取所有学生选的课程,并生成一个唯一的课程列表。

data class Student(val name: String, val courses: List<String>)

fun main() {
    val students = listOf(
        Student("Alice", listOf("Math", "Science", "Art")),
        Student("Bob", listOf("Math", "History")),
        Student("Charlie", listOf("Science", "Art"))
    )

    val allCourses = students.flatMap { it.courses }.distinct()

    println(allCourses)
}

输出结果

[Math, Science, Art, History]

在这个例子中,我们使用了 flatMap 来提取每个学生所选的课程列表,然后通过 distinct 方法来确保课程不会重复。

嵌套数据结构的处理 🏗️

在实际开发中,我们经常会处理嵌套的数据结构,比如包含多个子集合的集合。flatMap 在这种场景下非常有用,它可以帮助我们将数据进行展平处理。来看下面这个例子,假设我们有一个图书馆系统,每本书可能有多个作者,我们希望提取所有的作者名单:

data class Book(val title: String, val authors: List<String>)

fun main() {
    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)
}

输出结果

[Dmitry Jemerov, Svetlana Isakova, Joshua Bloch, Robert C. Martin, Martin Fowler, Kent Beck]

通过 flatMap,我们轻松将每本书的作者列表展平,并生成了一个不重复的作者名单。

结论 🎉

flatMap 是 Kotlin 中处理嵌套集合或生成新的集合的一个非常强大的工具。它可以将多个子集合合并为一个单一集合,简化了很多处理集合的复杂操作。通过它,开发者可以更简洁、高效地处理数据,尤其是在处理嵌套集合时。

感谢阅读!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

websim.ai 体验过程+感受

体验 websim.ai 后感觉网站更倾向于客户提需求或者满足客户需求的可视化页面阶段&#xff0c;比较像设计界面。就是一直命令AI添加功能&#xff0c;然后它绘图。导出的代码是单个HTML文件&#xff0c;用前端三件套写的。 体验过程 ① Create a relationship diagram between …

四数之和--力扣18

四数之和 题目思路代码 题目 思路 类似于三数之和&#xff0c;先排序&#xff0c;利用双指针解题。 如果排序后的第一个元素大于目标值&#xff0c;直接返回&#xff0c;为什么nums[i]需要大于等于0&#xff0c;因为目标值可能为负数。比如&#xff1a;数组是[-4, -3, -2, -1…

电水壶自复位热断循环测试合规性

在家用电器安全标准中,电水壶的安全性尤为重要,尤其是涉及热保护装置的部分。电水壶在日常使用中频繁接触高温水,极端情况下,温度可能异常升高。因此,为了确保用户的安全,热保护装置必须可靠工作。本文将探讨自复位热断路器(TCO)在电水壶中的作用,以及在100次循环测试…

9.13信锐面经

1.C程序的编译过程?C头文件是怎么预处理的? 当编译器遇到#include指令时&#xff0c;它会将指定的头文件内容插入到当前源文件中。这个过程是递归的&#xff0c;即如果被包含的头文件中又有其他的#include指令&#xff0c;那么也会继续包含相应的头文件。 头文件中可能包含宏…

Nature Aging | 还在做差异分析吗?相关性+常规机器学习模型,这篇顶刊纯生信的研究思路可以说领先了一个版本!

先前给大家分享了一篇 Nature Medince 的年龄相关建模文章&#xff0c;阅读量蛮高&#xff0c;大家也都十分感兴趣。这个领域的生信研究确实会有一些特色&#xff0c;一些高分模型研究或多或少都偏向于模型的可解释性。 ▲ Nature Medicine | 常规机器学习构建蛋白质组衰老时钟…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…

OAExploit一款基于OA产品的一键扫描工具

OAExploit一款基于OA产品的一键扫描工具 01 项目介绍 一款扩展性高的渗透测试框架渗透测试框架 出现卡死的几种情况&#xff1a;1.点击按钮太快 2. 打印log 的异常 02 工具展示

说真心话,在IT行业,项目经理不懂「敏捷管理」真混不下去!

根据PMI官方2015年的《职业脉搏调查》报告显示&#xff0c;高度敏捷、快速做出市场反应的组织与行动迟缓的组织相比&#xff0c;项目的成功率更高。 因此&#xff0c;在快速发展的IT行业中&#xff0c;项目经理如果能够具备快速迭代、灵活应对市场需求的“敏捷管理”思维会更吃…

--- 数据结构 优先级队列 --- java

之前提高到队列是一种先进先出的结构&#xff0c;但是在某些情况下操作的数据具有优先级&#xff0c;那么对他先进行操作&#xff0c;这时队列就不能满足需求了&#xff0c;因为队列只能操作对头的元素&#xff0c;而具有优先级的数据不一定是在对头&#xff0c;这样就需要优先…

RHCE--复习(二)之时间同步服务器

一、计时方式的发展 1.1.古代计时方式 在远古时期&#xff0c;人类用来确定时间的方式是一些自然界“相对”宜古不变的周期。如地球的公转是为一年&#xff0c;月球的公转是为一月&#xff0c;地球的自转是为一天等&#xff0c;最早的计时可以追溯到公元前大约2000年&#xff…

ESP8266+eclipse+AP+最简单webserver

实现AP模式下&#xff0c;http-server功能 在ESP8266_RTOS_SDK\ESP8266_RTOS_SDK\examples\wifi\getting_started\softAP增加webserver部分代码 1. 代码 //softap_example_main.c /* WiFi softAP ExampleThis example code is in the Public Domain (or CC0 licensed, at y…

LLaMA-Factory QuickStart

转自&#xff1a;知乎 1. 项目背景 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xf…

R1234yf汽车空调制冷剂简介

R1234yf汽车空调制冷剂是一种具有优异性能的环保型制冷剂,它被设计用于替代传统的R134a制冷剂。以下是关于R1234yf汽车空调制冷剂的详细介绍: 一、基本属性 化学名称:2,3,3,3-四氟丙烯 简称:R1234yf或HFO-1234yf 性质:无色HFO制冷剂气体 二、环保特性

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

【原创】java+swing+mysql项目管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

小程序开发设计-第一个小程序:安装开发者工具③

第一个小程序&#xff1a;安装开发者工具 1.了解微信开发者工具&#xff1a; 微信开发者工具是官方推荐使用的小程序开发工具&#xff0c;它提供的主要功能如下&#xff1a; ①.快速创建小程序项目 ②.代码的查看和编辑 ③.对小程序功能进行测试 ④.小程序的预览和发布 2.下载…

swiftUI结构体数组修改属性UI没更新

SwiftUI使用了值语义&#xff0c;即当数组的值发生更改时&#xff0c;SwiftUI无法检测到具体的更改操作。 要解决这个问题&#xff0c;可以使用SwiftUI中的State属性包装器来创建一个可观察的状态变量。当数组发生更改时&#xff0c;通过更改状态变量的值来触发列表的更新,但是…

ASCII、Unicode、UCS-2、UTF-8互转编码原理

基础 ASCII (American Standard Code for Information Interchange),1967年 GB2312 是中华人民共和国国家汉字信息交换用编码,国家标准总局发布&#xff0c;1981年5月1日实施,对应的国标标准号&#xff1a;GB/T 2312-1980 Unicode 1990年开始研发&#xff0c;1994年发布初版…

【聊聊AI编程必不可少的NLTK及其punkt、punkt_tab安装】

聊聊AI编程必不可少的NLTK及其punkt、punkt_tab安装 前言一、NLTK是什么&#xff1f;二、安装NLTK1.通过cmd安装&#xff1a;2.通过conda安装&#xff1a; 三.下载NLTK Data数据包1.官网下载2.Github下载3.Gitee下载3.1 下载并安装nltk_data3.2 下载并安装punkt_tab 4. nltk_da…

开展文化创新与传承 全球老子圣像评选启动

9月11日&#xff0c;在刚见证了中华社会文化发展基金会老子文化公益基金成立发布会盛典的中华文化园&#xff0c;又迎来了中华社会文化发展基金会领导的亲临指导。本次指导由中华社会文化发展基金会执行副秘书长蒋晔带队&#xff0c;魏欣主任和高凯主任同行&#xff0c;共同考察…