Kotlin 中的 `flatMap` 方法详解

在这里插入图片描述

在 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.mzph.cn/pingmian/54261.shtml

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

相关文章

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是必答题。面对这一挑战&#xff0c;Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野&#xff0c;成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

AirTest 基本操作范例和参数解释(一)

背景&#xff1a;基于目前团队中推广UIAutomation&#xff0c;采用了网易的UI自动化平台&#xff0c;平台兼容iOS、Android和WEB&#xff0c;是个跨平台的多库平台&#xff0c;利用poco和python进行脚本编写和开展自动化&#xff0c;但是在日常使用中有些同学对于一些关键字和参…

毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

需求3:照猫画虎

说起写需求&#xff0c;其实对于我这种小白而言&#xff0c;接到一个需求&#xff0c;最好的方式就是照猫画虎。 因为我从0到1写&#xff0c;以我现在这种水平&#xff0c;根本就不可能完成。所以照猫画虎&#xff0c;模仿着来写是最好的提升方法。 之前在聊天的时候&#xf…

查看VSFTPD配置的服务器路径和linux系统有哪些用户

要查看VSFTPD (Very Secure FTP Daemon)配置中定义的服务器路径,需要检查VSFTPD的配置文件。这通常可以在配置文件中找到并有不同的选项来设置路径。 这里有几个方法可以查看配置的服务器路径: 1. 检查主配置文件 VSFTPD的默认配置文件通常位于`/etc/vsftpd.conf`。可以使用…

Windows11家庭版修改用户密码策略为永不过期。

今天有个朋友找到我说&#xff0c;他的电脑密码老是过期然后需要修改&#xff0c;让我帮忙改一下密码策略&#xff0c;改为永不过期。 下面就来操作一下吧。 这里有个小小的坑&#xff0c;就是win11的家庭版是没有 gpedit.msc的&#xff0c;也就不能直接cmd打开本地策略便器&…

day20JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…

Linux下进程间的通信--共享内存

共享内存概述&#xff1a; 共享内存是进程间通信的一种方式&#xff0c;它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式&#xff0c;因为它允许进程直接对内存进行读写操作&#xff0c;而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

Linux 中的 Screen 命令详解

目录 前言1. 什么是 Screen 命令2. Screen 命令的主要功能3. Screen 命令的安装4. Screen 的基础使用4.1 启动一个新的 Screen 会话4.2 恢复一个断开的 Screen 会话4.3 退出一个 Screen 会话 5. Screen 命令的常用参数5.1 -S&#xff1a;指定会话名称5.2 -r&#xff1a;恢复会话…

使用SpringCloud构建可伸缩的微服务架构

Spring Cloud是一个用于构建分布式系统的开源框架。它基于Spring Boot构建&#xff0c;并提供了一系列的工具和组件&#xff0c;用于简化开发分布式系统的难度。Spring Cloud可以帮助开发人员快速构建可伸缩的微服务架构。 要使用Spring Cloud构建可伸缩的微服务架构&#xff0…

PCIe进阶之TL:Request Handling Rules

1 Handling of Received TLPs 本节介绍接收到的 TLP 在数据链路层经过完整性验证之后,这些 TLP 在事务处理层时的处理方式。这些规则如下图所示: 接收侧会忽略保留字段。如果 Fmt 字段显示存在至少一个 TLP Prefix : (1)通过检查后续 DWORD 的第一个字节中的 Fmt 字段,…

HTML中直接创建一个“onoff”图形开关包括css+script

1. HTML中直接创建一个“onoff”图形开关 下面是一个完整的HTML文档示例 在HTML中直接创建一个“onoff”图形开关&#xff08;通常指的是一个类似于物理开关的UI组件&#xff0c;可以切换开或关的状态&#xff09;&#xff0c;并不直接支持&#xff0c;因为HTML主要用于内容的…

研究生存指南:必备Zotero插件,让你的文献管理更轻松

在读研阶段&#xff0c;我经常面临大量文献阅读和项目研究的任务。忽略文献整理会导致后续使用时非常不便&#xff0c;查找困难且混乱。导师向我们推荐了 Zotero&#xff0c;经过亲身试用&#xff0c;我发现它非常好用&#xff01;zotero有非常多的插件&#xff0c;能够一个就满…

web学习——VUE

VUE&Element 今日目标&#xff1a; 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted能够进行简单的 Element 页面修改能够完成查询所有功能能够完成添加功能 1&#xff0c;VUE 1.1 概述 接下来我们学习一款前端的框架&#xff0c;就是 VUE。 Vue 是…

kubernetes调度2

1、各种缩写的应用 [rootk8s-master test]# kubectl get rsNAME DESIRED CURRENT READY AGEtest001-64c7957b5c 2 2 2 8m59stest001-698b98bb8f 0 0 0 12m[rootk8s-master test]# kubectl get replicas…

provide,inject父传子

这个方法传递子参数&#xff0c;可以让所有的子组件获取到&#xff0c;不能子组件传递给父组件 父组件 说下大概思路&#xff0c;导入privode&#xff0c;然后使用privode方法&#xff0c;有点像redis&#xff0c;key value形式存值&#xff0c;子组件可以通过key来获取你要传…

C#事件的用法

前言 在C#中&#xff0c;事件&#xff08;Event&#xff09;可以实现当类内部发生某些特定的事情时&#xff0c;它可以通知其他类或对象。事件是基于委托&#xff08;Delegate&#xff09;的&#xff0c;委托是一种类型安全的函数指针&#xff0c;它定义了方法的类型&#xff…

昂科烧录器支持Senasic琻捷电子的蓝牙低功耗芯片SNP746

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Senasic琻捷电子的蓝牙低功耗芯片SNP746已经被昂科的通用烧录平台AP8000所支持。 SNP746是一款蓝牙低功耗芯片&#xff0c;集成了压力传感器和加速度传感器的测量电路。它是为…

Python知识点:深入理解Python的模块与包管理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 深入理解Python的模块与包管理 Python的模块和包是代码组织、复用和分发的基本…