Lambda 表达式是什么以及如何使用
目录
📌 Kotlin 的 Lambda 表达式详解
🎯 什么是 Lambda 表达式?
🔥 1. Lambda 表达式的基本语法
✅ 示例 1:Lambda 基本写法
✅ 示例 2:使用 it 关键字(单参数简化)
✅ 示例 3:Lambda 作为函数参数
✅ 示例 4:Lambda 作为高阶函数的参数
🔍 2. Kotlin Lambda 的应用场景
✅ 1️⃣ Lambda 与 map 转换集合
✅ 2️⃣ Lambda 与 filter 过滤元素
✅ 3️⃣ Lambda 与 forEach 遍历集合
✅ 4️⃣ Lambda 与 sortedBy 排序
✅ 5️⃣ Lambda 与 groupBy 分组
🚀 3. Lambda 表达式进阶
✅ 1️⃣ 带返回值的 Lambda
✅ 2️⃣ Lambda 作为返回值
✅ 3️⃣ Lambda 与 apply、let、run、also
🎯 4. 总结
📌 Kotlin 的 Lambda 表达式详解
🎯 什么是 Lambda 表达式?
Lambda 表达式是一种 匿名函数,可以用更简洁的方式表示 函数,并作为参数传递给其他函数。它是 Kotlin 函数式编程的重要特性,类似于 Java 的 Lambda,但更加灵活。
在 Kotlin 中,Lambda 表达式的语法如下:
val lambdaName: (参数类型) -> 返回类型 = { 参数名: 参数类型 -> 函数体 }
🔥 1. Lambda 表达式的基本语法
👉 Lambda 语法结构
{ 参数1: 类型, 参数2: 类型 -> 函数体 }
如果 Lambda 只有一个参数,可以使用 it
关键字省略参数名。
✅ 示例 1:Lambda 基本写法
// Lambda 表达式赋值给变量
val add: (Int, Int) -> Int = { a, b -> a + b }println(add(3, 5)) // 输出: 8
📌 解析:
-
val add: (Int, Int) -> Int
👉 表示add
是一个接收两个Int
类型参数并返回Int
类型的 Lambda。 -
{ a, b -> a + b }
👉 这是 Lambda 的实现部分。
✅ 示例 2:使用 it
关键字(单参数简化)
如果 Lambda 只有 一个参数,可以用 it
代替参数名:
val square: (Int) -> Int = { it * it }println(square(4)) // 输出: 16
📌 解析:
-
{ it * it }
👉it
代表传入的唯一参数。
✅ 示例 3:Lambda 作为函数参数
在 Kotlin 中,Lambda 通常作为参数传递给其他函数,如 map
、filter
、forEach
等。
val numbers = listOf(1, 2, 3, 4, 5)// 使用 Lambda 过滤偶数
val evenNumbers = numbers.filter { it % 2 == 0 }println(evenNumbers) // 输出: [2, 4]
📌 解析:
-
filter { it % 2 == 0 }
👉 这个 Lambda 只保留偶数。 -
it
👉 代表filter
作用的每个元素。
✅ 示例 4:Lambda 作为高阶函数的参数
高阶函数是接收 Lambda 作为参数或者返回 Lambda 的函数。
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {return operation(a, b)
}// 传递 Lambda
val result = operate(10, 5) { x, y -> x - y }
println(result) // 输出: 5
📌 解析:
-
operation: (Int, Int) -> Int
👉 代表 Lambda 需要接收两个Int
参数,并返回Int
结果。 -
{ x, y -> x - y }
👉 传递 Lambda 计算10 - 5
。
🔍 2. Kotlin Lambda 的应用场景
Lambda 主要用于高阶函数,在 Kotlin 中被广泛应用,如集合操作、回调、DSL(领域特定语言)等。
✅ 1️⃣ Lambda 与 map
转换集合
val numbers = listOf(1, 2, 3, 4)// 使用 Lambda 对列表元素进行平方
val squaredNumbers = numbers.map { it * it }println(squaredNumbers) // 输出: [1, 4, 9, 16]
📌 解析:
-
map { it * it }
👉 将numbers
中的每个元素平方后返回新列表。
✅ 2️⃣ Lambda 与 filter
过滤元素
val words = listOf("Kotlin", "Java", "Python", "Swift")// 过滤包含 'a' 的单词
val filteredWords = words.filter { "a" in it }println(filteredWords) // 输出: [Java]
📌 解析:
-
filter { "a" in it }
👉 只保留包含a
的单词。
✅ 3️⃣ Lambda 与 forEach
遍历集合
val names = listOf("Alice", "Bob", "Charlie")names.forEach { println(it) }// 输出:
// Alice
// Bob
// Charlie
📌 解析:
-
forEach { println(it) }
👉 逐个打印列表元素。
✅ 4️⃣ Lambda 与 sortedBy
排序
val people = listOf("Tom", "Alice", "Bob")// 按字母顺序排序
val sortedPeople = people.sortedBy { it.length }println(sortedPeople) // 输出: [Tom, Bob, Alice]
📌 解析:
-
sortedBy { it.length }
👉 按字符串长度排序。
✅ 5️⃣ Lambda 与 groupBy
分组
val words = listOf("apple", "banana", "cherry", "blueberry")// 按单词首字母分组
val groupedWords = words.groupBy { it.first() }println(groupedWords)
// 输出: {a=[apple], b=[banana, blueberry], c=[cherry]}
📌 解析:
-
groupBy { it.first() }
👉 按首字母分组。
🚀 3. Lambda 表达式进阶
✅ 1️⃣ 带返回值的 Lambda
在 Lambda 中,return
只能用于 具名函数,不能直接用于 Lambda。
val sum = { a: Int, b: Int -> a + b }
println(sum(4, 5)) // 输出: 9
如果 Lambda 需要显式 return
,必须加上 @标签
:
fun test() {listOf(1, 2, 3, 4).forEach {if (it == 2) return@forEach // 只跳出当前 Lambdaprintln(it)}println("结束")
}test()
// 输出:
// 1
// 3
// 4
// 结束
✅ 2️⃣ Lambda 作为返回值
fun getLambda(): (Int) -> Int {return { it * 2 }
}val double = getLambda()
println(double(5)) // 输出: 10
📌 解析:
-
getLambda()
👉 返回一个Lambda
,用于将输入值 *2。
✅ 3️⃣ Lambda 与 apply
、let
、run
、also
Kotlin 提供了一些 内置扩展函数,让代码更简洁。
data class Person(var name: String, var age: Int)val person = Person("Alice", 20).apply {name = "Bob"age = 25
}println(person) // 输出: Person(name=Bob, age=25)
📌 解析:
-
apply {}
👉 在对象Person
上直接操作,无需person.name = "Bob"
。
🎯 4. 总结
Lambda 特性 | 说明 |
---|---|
匿名函数 | 可以作为参数传递 |
简洁性 | 代码更短,更直观 |
高阶函数 | Lambda 可以作为参数或返回值 |
it 关键字 | 单参数 Lambda 省略参数名 |
与集合操作结合 | map 、filter 、sortedBy 等 |
DSL 支持 | Kotlin DSL 语法依赖 Lambda |
💡 Lambda 使 Kotlin 代码更简洁、高效,是 Kotlin 编程的重要特性!🚀
相关文章:
Lambda 表达式是什么以及如何使用
目录 📌 Kotlin 的 Lambda 表达式详解 🎯 什么是 Lambda 表达式? 🔥 1. Lambda 表达式的基本语法 ✅ 示例 1:Lambda 基本写法 ✅ 示例 2:使用 it 关键字(单参数简化) ✅ 示例 3…...
C++自定义迭代器
实现自己的迭代器 最近在写数据结构,使用类模板实现,碰到了一些问题,其中有一个就是遍历的问题,查阅资料最后实现了自己的迭代器,让我实现的数据结构能像STL一样进行for循环遍历。 类的构成 #include <stdexcept…...
PWA 中的 Service Worker:如何实现应用离线功能
前言 在当今快速发展的互联网时代,Progressive Web App (PWA) 正在逐步成为现代 Web 开发的主流选择。PWA 将 Web 应用和原生应用的最佳特性相结合,提供了丰富的用户体验。而在 PWA 的众多技术中,Service Worker 无疑是其核心组件之一。 作…...
dockerfile制作镜像
1.docker pull centos:centos7 2.dockerfile内容 FROM centos:centos7 #指定镜像维护的作者和邮箱 MAINTAINER csdn< **********qq.com #设置环境变量mypath ENV MYPATH /usr/local #设置进入容器的默认目录是/usr/local WORKDIR $MYPATH # 下载并替换 CentOS 镜像源 RUN …...
网络空间安全(46)DevSecOps概述
一、定义与核心理念 DevSecOps是“开发(Development)、安全(Security)和运营(Operations)”的结合,它将安全实践融入软件开发生命周期的每个阶段,从需求、设计、开发、测试到部署和运…...
LeetCode 211
实现支持通配符的字典树(Trie):解决单词匹配问题 一、问题描述 我们需要设计一个数据结构,支持以下功能: 添加新单词搜索字符串是否与任何已添加的单词匹配,其中搜索字符串可能包含通配符 .(…...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
利用deepseek直接调用其他文生图网站生成图片
这次deepseek输入中文后,其实翻译英文后,是可以丢到比如pollinations.这个网站,来生成图片,用法如下: 你是一个图像生成助手,请根据我的简单描述,想象并详细描述一幅完整的画面。 然后将你的详…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
11. 盛最多水的容器
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 最左右两边逐步往中间走,每次在左右中选取小的一个或–记录最大面积 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景: --- ### **一、变量与常量** #### **1. 变量类型** - **val**(不可变变量):声明后不可重新赋值,类似 Java 的 final。 kotlin val name "Kotl…...
html 列表循环滚动,动态初始化字段数据
html <div class"layui-row"><div class"layui-col-md4"><div class"boxall"><div class"alltitle">超时菜品排行</div><div class"marquee-container"><div class"scroll-…...
【大模型基础_毛玉仁】5.4 定位编辑法:ROME
目录 5.4 定位编辑法:ROME5.4.1 知识存储位置1)因果跟踪实验2)阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1)确定键向量2)优化值向量3)插入知识 5.4 定位编辑法:ROME 定位编辑:…...
Using SAP an introduction for beginners and business users
Using SAP an introduction for beginners and business users...
Android学习总结之RecyclerView补充篇
在 Android 开发中,列表数据更新的性能一直是关键痛点。传统的 notifyDataSetChanged() 会触发全量刷新,导致不必要的界面重绘。而 DiffUtil 作为 Android 提供的高效差异计算工具,能精准识别数据变化,实现局部更新,成…...
mapbox基础,使用geojson加载cluster聚合图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️circle点图层样式二、🍀使用geojson加…...
函数:static和extern
0.前言 在正式开始之前先说作用域和生命周期 作用域: 作用域有分为局部变量和全局变量 局部变量:一个变量仅在其中一段代码内起作用 全局变量:所有的代码都可以使用这个变量 生命周期: 生命周期是一个代码从运行开始到结束…...
【QT】练习1
1、设计一个颜色选择器,可以输入RGB的颜色值,点击确认,可以把主界面的背景颜色改成设置的颜色 修改背景颜色:setStyleSheet(“background-color 红绿蓝颜色值”); // mainwindow.cpp #include "mainwindow.h" #include…...
GreenPlum学习
简介 Greenplum是一个面向数据仓库应用的关系型数据库,因为有良好的体系结构,所以在数据存储、高并发、高可用、线性扩展、反应速度、易用性和性价比等方面有非常明显的优势。Greenplum是一种基于PostgreSQL的分布式数据库,其采用sharednothi…...
张量-pytroch基础(2)
张量-pytroch网站-笔记 张量是一种特殊的数据结构,跟数组(array)和矩阵(matrix)非常相似。 张量和 NumPy 中的 ndarray 很像,不过张量可以在 GPU 或其他硬件加速器上运行。 事实上,张量和 Nu…...
Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
目录 📌这篇博客能带给你什么? 🔥为什么需要封装这些组件? 一、线程封装 框架设计 构造与析构 1.线程创建 2.线程分离 3.线程取消 4.线程等待 二、锁封装 框架设计 构造与析构 1.加锁 2.解锁 3.RAII模式 三、条件…...
2025年智慧能源与控制工程国际学术会议(SECE 2025)
官网:www.ic-sece.com 简介 2025年智慧能源与控制工程国际学术会议(SECE 2025)将于2025年4月18日线上会议形式召开,这是一个集中探讨全球智慧能源和控制工程领域创新和挑战的国际学术平台。旨在汇集全球领域内的学者、研究人员、…...
Android 16开发实战指南|锁屏交互+Vulkan优化全解析
一、环境搭建与项目初始化 1. 安装Android Studio Ladybug 下载地址:Android Studio官网关键配置: # 安装后立即更新SDK SDK Manager → SDK Platforms → 安装Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通过命令行安装SDK组…...
sscanf() 用法详解
sscanf() 是 scanf() 的变体,它用于从字符串中提取格式化数据,常用于解析输入字符串。 1️⃣ sscanf() 语法 int sscanf(const char *str, const char *format, ...); str:要解析的字符串(必须是 const char*,可以用…...
0基础入门scrapy 框架,获取豆瓣top250存入mysql
一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名) 使用终端运行太麻烦了,而且…...
Linux常见操作命令(2)
(一)复制和移动 复制和移动都分为文件和文件夹,具体的命令是cp和mv。 1.复制文件(复制的文件要是已创建) 格式:cp 源文件 目标文件。 示例:把filel.txt复制一份得到file2.txt。 那么对应的命令就是&#x…...
谷歌将 Android OS 完全转变为 “内部开发”
2025 年 3 月 27 日,据 Android Authority 报道,谷歌证实将从下周开始完全在内部分支机构闭门开发安卓操作系统。相关信息如下: 背景:多年来,谷歌同时维护着两大安卓主要分支,一是面向公众开放的 “安卓开源…...
移动端六大语言速记:第2部分 - 控制结构
移动端六大语言速记:第2部分 - 控制结构 本文继续对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的控制结构,帮助开发者快速掌握各语言的语法差异。 2. 控制结构 2.1 条件语句 各语言条件语句的语法对比: …...
【 Vue 2 中的 Mixins 模式】
Vue 2 中的 Mixins 模式 在 Vue 2 里,mixins 是一种灵活的复用代码的方式,它能让你在多个组件间共享代码。借助 mixins,你可以把一些通用的选项(像 data、methods、computed 等)封装到一个对象里,然后在多…...
STM32F103_LL库+寄存器学习笔记13 - 梳理外设CAN与如何发送CAN报文(串行发送)
导言 CAN总线因其高速稳定的数据传输与卓越抗干扰性能,在汽车、机器人及工业自动化中被广泛应用。它采用分布式网络结构,实现多节点间实时通信,确保各控制模块精准协同。在汽车领域,CAN总线连接发动机、制动、车身系统,…...
DataPlatter:利用最少成本数据提升机器人操控的泛化能力
25年3月来自中科院计算所的论文“DataPlatter: Boosting Robotic Manipulation Generalization with Minimal Costly Data”。 视觉-语言-动作 (VLA) 模型在具身人工智能中的应用日益广泛,这加剧对多样化操作演示的需求。然而,数据收集的高成本往往导致…...
受控组件和非受控组件的区别
在 React 中,受控组件(Controlled Components) 和 非受控组件(Uncontrolled Components) 是处理表单元素的两种不同方式,它们的核心区别在于 数据管理的方式 和 与 React 的交互模式。 受控组件…...
Mhand Pro 多节点动作捕捉手套:一副手套多场景应用
随着动作捕捉技术的发展,动捕手套的出现为虚拟现实交互、VR游戏开发、机器臂/灵巧手遥操作等方面带来了更加便捷可行的方案。 广州虚拟动力作为一家在动作捕捉领域深耕多年的公司,基于传感器技术而研发的多节点惯性动作捕捉手套,兼具VR交互与…...
Kafka消息丢失全解析!原因、预防与解决方案
作为一名高并发系统开发工程师,在使用消息中间件的过程中,无法避免遇到系统中消息丢失的问题,而Kafka作为主流的消息队列系统,消息丢失问题尤为常见。 在这篇文章中,将深入浅出地分析Kafka消息丢失的各种情况…...
BERT与Transformer到底选哪个-上部
一、先理清「技术家谱」:BERT和Transformer是啥关系? 就像「包子」和「面食」的关系——BERT是「Transformer家族」的「明星成员」,而GPT、Qwen、DeepSeek这些大模型则是「Transformer家族」的「超级后辈」。 1.1 BERT:Transfor…...
【Unity】记录TMPro使用过程踩的一些坑
1、打包到webgl无法输入中文,编辑器模式可以,但是webgl不行,试过网上的脚本,还是不行 解决方法:暂时没找到 2、针对字体asset是中文时,overflow的效果模式处理奇怪,它会出现除了overflow模式以…...
数据处理的两种范式:深入解析OLTP与OLAP系统
目录 前言1. OLTP:业务运作的基石1.1 OLTP的核心定义与价值1.2 OLTP的技术架构特点1.3 OLTP的典型应用场景 2. OLAP:决策支持的大脑2.1 OLAP的基本概念与作用2.2 OLAP的技术实现方式2.3 OLAP的应用实践 3. OLTP与OLAP的对比与融合3.1 核心差异的深度解析…...
本地飞牛NAS快速部署WordPress个人网站并一键上线公网远程访问
文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗…...
windows环境下的cmake使用
创建一个目录testcmake 进入目录 创建一个文件main.cpp : #include <iostream> using namespace std; int main(){cout<<"what is going on?"<<endl;return 0; }再创建一个cmakelists.txt set(CMAKE_CXX_STANDARD 20) add_executable(test2 mai…...
多线程(多线程案例)(续~)
目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀,直达地址…...
同步SVPWM调制策略的初步学习记录
最近项目需要用到一些同步调制SVPWM相关的内容(现在的我基本都是项目驱动了),因此对该内容进行一定的学习。 1 同步SVPWM调制的背景 我们熟知的一些知识是:SVPWM(空间矢量脉宽调制)是一种用于逆变器的调制…...
权重参数矩阵
目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1:全连接网络中的…...
堆叠虚拟化
各厂商叫法不同:思科 VSS 锐捷 VSU 华为 Stack 华三 IRF 虚拟化为一台设备进行管理,从而实现高可靠性。当任意交换机故障时,都能实现设备、链路切换,保护客户业务稳定运行 传统的园区网高可靠性技术出现故障时切换时间很难做到毫…...
3.31-4 性能面试题
面试题 1、性能问题的六个特征: (1)、持续缓慢: (2)、随着时间推进越来越慢、 (3)、随着负载增加越来越慢、 (4)、零星挂起或异常错误、 (5…...
2025年最新自动化/控制保研夏令营预推免面试真题分享(东南/浙大/华科清华)
笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题 东南大学自动化学院 东南大学: 东南大学面试有一个十分明显的特点,就是极其注重专业课,基本上就是在面试的时候电脑上会有几个文件夹&#x…...
freecad手动装插件 add on
python工作台输入 FreeCAD.ConfigGet("UserAppData") 在返回的地址上新建文件夹:Mod #like /home/chen/snap/freecad/common 进入Mod #like /home/chen/snap/freecad/common/Mod git clone 你要的项目 #like git clone https://github.com/looooo/f…...
mysql 主从搭建步骤
主库: 开启log-bin参数,log-bin 参数修改需要重启服务器 --You can change the server_id value dynamically by issuing a statement like this:SET GLOBAL server_id 2;--to enable binary logging using a log file name prefix of mysql-bin, and c…...
从AI大模型到MCP中台:构建下一代智能服务的核心架构
从AI大模型到MCP中台:构建下一代智能服务的核心架构 引言:AI大模型带来的服务重构革命 在ChatGPT掀起全球AI热潮的今天,大模型展现出的惊人能力正在重塑整个软件服务架构。但鲜为人知的是,真正决定AI服务成败的不仅是模型本身&a…...
31天Python入门——第18天:面向对象三大特性·封装继承多态
你好,我是安然无虞。 文章目录 面向对象三大特性1. 封装2. 继承3. 多态4. 抽象基类5. 补充练习 面向对象三大特性 面向对象编程(Object-Oriented Programming, 简称OOP)有三大特性, 分别是封装、继承和多态.这些特性是面向对象编程的基础, …...