kotlin学习笔记——Lambda表达式

Kotlin系列之filter、find、any、map、flatMap、takeWhile、reduce、groupBy常见高阶函数 阅读详情


最近在学郭神的《第三行代码》,大部分内容出自于此,另外加上我自己的一些总结和体会,记此学习笔记,若有歧义,欢迎指出,一起学习进步!

本篇内容主要介绍了Lambda表达式的用法和Kotlin中常用的简化规则,提升代码阅读能力,理解之后就能明白,为什么kotlin大神的代码可以如此优雅

定义

直白的说,Lambda就是一小段可以作为参数传递的代码。

一般向某个函数传参都只能是变量,而Lambda可以传一段代码。
类似python中的map、reduce函数,允许传入Lambda表达式,ketlin的集合中也有很多类似的函数式API ,如map() filter() maxByOrNull()等( 书中的maxBy() 已被弃用)
虽然kotlin对传入的代码长度没有限制,但是太长可能会影响代码的可读性。

基本用法

如下,在集合中找到长度最长的单词

val list = listOf("Hello", "world", "I", "am", "kotlin")
val lambda = { word: String -> word.length }
val maxLengthWord = list.maxByOrNull(lambda)    //maxByOrNull传入一小段代码
println("max length word is $maxLengthWord")

简化用法

我们可以将上面的代码简化处理,就得到如下:

val list = listOf("Hello", "world", "I", "am", "kotlin")
val maxLengthWord = list.maxByOrNull { it.length }	// maxByOrNull传入的就是一个简化的Lambda表达式
println("max length word is $maxLengthWord")

是不是省了很多代码,也优雅很多

简化规则

下面我们逐步进行简化,来方便理解kotlin的作为函数式语言的精髓

规则一

可以不需要专门定义lambda,可以将其直接传入,如下:

val maxLengthWord = list.maxByOrNull({ word: String -> word.length })

规则二

kotlin中,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号( )的后面,如下:

val maxLengthWord = list.maxByOrNull() { word: String -> word.length }

规则三

kotlin中,如果Lambda参数是函数的唯一参数的话,可以将函数括号( )省略,如下:

val maxLengthWord = list.maxByOrNull { word: String -> word.length }

规则四

kotlin拥有出色的类型推导机制,因此可以省略参数类型声明,如下:

val maxLengthWord = list.maxByOrNull { word -> word.length }

规则五

当Lambda表达式的参数列表中只有一个参数时,可以省略声明参数名,直接用 it 关键字代替,就得到了上面的最终简化版本,如下:

val maxLengthWord = list.maxByOrNull { it.length }

举一反三

上述的简化规则在使用Kotlin时可以灵活运用
例如Android中最常用的设置点击监听,本来完整代码应该如下:

widgetBtnF2nmczuc.setOnClickListener(object : View.OnClickListener {
      override fun onClick(p0: View?) {
            Log.d(TAG, p0.toString())
        }
    })

上述代码可以使用Lambda表达式来简化

规则六

kotlin中,需要实现某个抽象类的时候,若该抽象类只有一个抽象方法需要重写,则可以用Lambda直接传入该方法的实现代码,java 1.8以后也支持如此,如下:

widgetBtnF2nmczuc.setOnClickListener({ p0 -> Log.d(TAG, p0.toString()) })

看到这里,是不是同上面 规则一 的时候一样了,再进行二、三、四、五的简化,就得到了如下代码:

widgetBtnF2nmczuc.setOnClickListener { Log.d(TAG, it.toString()) }

总结

kotlin的Lambda表达式和标准函数搭配起来灵活运用,可以帮助我们减少很多不必要的代码,编程变得如此优雅。
需要注意的是,以上规则的运用条件要清楚,不满足条件的时候可不能简化噢。例如 规则六 中,抽象类的抽象方法只有一个时,才能简化成Lambda表达式, 规则五 中,Lambda参数只有一个时才能省略并用 it 关键字来代替他的参数。

Ubuntu 24.04 LTS安装WPS Office 2025冬季版全攻略(附字体缺失解决方案) 本文提供了在Ubuntu 24.04 LTS系统上安装WPS Office 2025冬季版的完整指南,详细对比了dpkg、Snap和GUI三种安装方式的优劣。针对安装后常见的中文字体缺失、思源黑体粗细异常等核心问题,给出了从原理分析到手动补充字体库、修改字体配置文件的深度解决方案,确保WPS Office在Linux环境下获得最佳使用体验。 阅读详情

相关推荐

从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成

本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。

weixin_29294975的博客 357

Kotlin笔记17--集合的函数式API之Lambda表达式

主要学习下 Lambda 表达式。 一个小例子,找到某个集合中名字最长的元素。 val list = listOf("Apple", "Banana", "Cherry", "Durian", "Orange", "Pear", "Watermelon") var longerName = ""; println("longerName = $longerName") println("longerName.length = " + longerName.length) for (item in list)

weixin_44021334的博客 295

IEC61850实战:从ICD文件解析到模型构建

本文深入解析IEC61850标准中的ICD文件结构,从Header、IED到DataTypeTemplates部分,详细介绍了如何构建电力自动化设备的数据模型。通过实战案例展示ICD文件的创建过程,并分享常见问题的调试技巧,帮助工程师快速掌握IEC61850建模方法,提升电力系统自动化项目的实施效率。

weixin_26841743的博客 496

Kotlin Lambda

always in curly braces {x: Int, y: Int -> x + y} if a lambda is the last argument in a function call, it can be placed after the parentheses list.maxByOrNull ({ it: Person -> it.age }) list.maxByOrNull () { it: Person -> it.age } if the lambda is.

weiwang_wang的博客 272

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

【Qt】QByteArray详解

对象共享同一份数据,直到修改时才进行深拷贝,以节省内存和计算资源。:可存储任意二进制数据(如图片、音频、协议数据),不依赖字符编码。与编码(如 UTF-8、Latin-1)之间的桥梁(例如。• 补零规则确保奇数字符串能正确解析,避免数据截断。:内部自动分配和释放内存,无需手动管理。将输入的字符串视为十六进制编码数据,返回实际数据长度(不包括结尾的。的输入必须是有效的十六进制字符(,但针对 Qt 框架做了优化。:处理加密后的二进制结果(如。• 如果输入字符串长度为奇数,• 若输入长度为奇数,自动在。

CSUC的博客 1597

Kotlin,简直是 Java 的 Pro Max!(笔记1)

Java 虚拟机只认识 class 文件,并且不会关心 class 是 java 文件编译来的还是其他文件编译来的. 那么此时我们自己创造一个语法规则,再做一个编译器,就可以让我们的语言跑在虚拟机上. Kotlin 正是如此,运行前会先编译成 class,再供 Java 虚拟机运行.

CYK_byte的博客 1694

Vivado时序约束实战:input_delay在高速接口设计中的关键作用

本文深入探讨了在Vivado时序约束中,input_delay对于高速接口设计的关键作用。通过一个RGMII以太网接口调试的实际案例,解释了为何仅靠仿真正确而实际数据采集会失败,并揭示了set_input_delay约束的本质是告知时序分析工具外部芯片的时序关系,而非添加物理延迟。文章详细讲解了如何根据数据手册计算约束值、针对不同采样时钟方案(如移相时钟)进行约束,并指导如何通过时序报告验证约束效果,是解决FPGA高速接口时序问题的实战指南。

ee345的博客 252

kotlin的集合使用maxBy函数报NoSuchElementException

kotlin设定函数。

柯伊柏 438

ESP32-CAM 赋能 AI 视觉巡检小车:自主避障与目标追踪实现全解析

本文基于 ESP32-CAM 实现了低成本 AI 视觉巡检小车的核心功能,硬件成本<100 元,兼顾自主避障与目标追踪。算法升级:移植 YOLOv5nano 量化模型(INT8),提升目标检测精度(如识别巡检场景中的 “异常物体”“人员”);无线拓展:通过 MQTT 协议将巡检图像、距离数据上传到阿里云 / 腾讯云,实现远程监控;多传感器融合:增加温湿度(DHT11)、红外测温(MLX90614)模块,扩展巡检维度;路径规划:结合 SLAM 算法,实现自主建图与路径巡检。

weixin_42300449的博客 367

软件可靠性测试与评价

本文系统介绍了软件可靠性工程的核心内容,包括可靠性概念、模型分类、测试方法和评价体系。重点解析了可靠性测试的三大步骤:定义运行剖面、设计测试用例和实施测试收集数据,并以智能安防系统为例说明具体应用。可靠性评价需结合业务场景,通过量化指标(MTBF、失效率等)和模型预测持续优化系统。文章强调可靠性需贯穿软件全生命周期,通过闭环反馈实现持续改进,为关键系统提供质量保障。

moton2017的博客 2049

kotlin学习笔记之Lambda表达式

Lamabda表达式:匿名函数 定义函数: Lambda表达式,也叫匿名函数 传统kotlin写法表示一个函数 fun sum(arg1:Int,arg2:Int):Int{ return arg1 + arg2 } 也可以如下写法 fun sum2(arg1: Int,arg2: Int) = arg1 + arg2 用Lambda表达式编码 val sum3 = {arg1:Int...

加油,向未来! 283

视觉提示学习(Prompt Learning):CV领域的GPT时刻?

视觉提示学习(Prompt Learning):CV领域的GPT时刻? ,人工智能,计算机视觉,大模型,AI,在人工智能技术不断演进的今天,计算机视觉(Computer Vision,CV)作为人工智能领域的重要分支,始终致力于让机器 “看懂” 世界。从早期基于传统特征工程的图像识别方法,到深度学习时代卷积神经网络(Convolutional Neural Networks,CNN)的崛起,CV 领域经历了多次重大变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

kotlin学习笔记——lambda表达式

语法 lambda被大括号包含 {T,T->Boolean},代表的含义是两个T类型参数,返回值为Boolean 练习一:遍历数组并打印 fun main() { //定义一个String类型的数组array val array: Array<String> ...

188

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Kotlin学习笔记——Lambda表达式

lambda 表达式与匿名函数是“函数字面值”,即未声明的函数, 但立即做为表达式进行传递。在Java 8中也开始支持Lambda表达式。 Lambda表达式语法 lambda 表达式由花括号括起来, 包含完整语法形式的参数声明,参数声明有可选的类型标注, 函数体跟在一个 -> 符号之后。如果可以推断出的该lambda表达式的返回类型不是 Unit,那么该 lambda 主体中的最后一个(或...

yingaizhu的博客 404

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Kotlin 学习笔记 第 5 篇 函数和 Lambda 表达式

文章目录背景1. 函数1.1 定义和调用函数单表达式函数1.2 函数的形参1.2.1 命名参数1.2.2 形参默认值1.2.3 个数可变的形参1.3 函数重载1.4 局部函数1.5 高阶函数1.5.1 函数类型1.5.2 函数类型作为形参类型 背景 函数其实可以理解成就是 Java 中所说的方法。函数是执行特定任务的一段代码,这段代码可以在需要的时候多次调用。因此,函数时代码复用的重要手段。 Kotlin 对 Java 的纯粹面向对象进行了补充,增加了函数式变成的支持,提高了变成的灵活性。Kotlin 融

u012764358的博客 378

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Kotlin学习笔记7——高阶函数和Lambda表达式

Kotlin学习笔记7——高阶函数和Lambda表达式前言高阶函数函数用作函数参数函数用作函数返回值自定义高阶函数Lambda 表达式与匿名函数Lambda 表达式语法拖尾 lambda 表达式it:单个参数的隐式名称lambda 表达式中返回一个值下划线用于未使用的变量匿名函数闭包尾巴 前言 上一篇,我们学习了Kotlin中的普通函数,今天继续来学习Kotlin中的函数。由于Kotlin中支持高阶函数语法,所以函数我们分为三篇来学习,今天是第二篇:高阶函数和Lambda表达式。 高阶函数 高阶函数是将函数

abs625的博客 893

新手上路,Kotlin学习笔记(四)---Lambda表达式在Kotlin中的使用

        入行没几年的小码农,近期学习Kotlin,做一份笔记记录,此文依据《Kotlin实战》这本书的流程记录,部分示例内容均摘自《Kotlin实战》,记下自己的理解,本篇记录Kotlin中对类,对象,接口的使用。        //上一章 新手上路,Kotlin学习笔记(三)---类、对象、接口                Lambda表达式是非常简洁的书写方式,在Java1.8中,我...

WonderfulMTF的博客 937

Kotlin Lambda 表达式学习笔记 (一)

Kotlin的Lambda表达式,你真的会用吗?

weixin_43935980的博客 410

Kotlin 学习笔记 五:函数和lambda表达式

注意事项: 1:只要在一个函数的函数体实现中再次调用了函数本身,就是递归函数。递归函数一定要向已知方向进行 2.函数只返回单个表达式,则可以用等号=即可 fun area(x:Double):Double =x,而对于单表达式函数而言,编译器可以自动推断函数的返回值类型,因此也可以改为fun area(x:Double)=x ...

qq_37635604的博客 379

Kotlin学习笔记(二) 函数与Lambda表达式

函数与Lambda表达式 一、函数 1. 声明 fun关键字 fun double(x: Int): Int { return 2 * x } 2. 用法 函数:传统方法 val res = double(2) 成员函数:点表示法 Stream().read() 3. 参数 使用Pascal表示法,name: type。每个参数必须有显式类型。 默认参数 fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { }

Imagine_Yao的博客 400

Kotlin学习笔记(九)函数,Lambda表达式

函数Kotlin中,使用fun关键字定义一个函数,函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。每个参数必须有显式类型。fun foo(arg1:String,arg2:Boolean,arg3:Int):Int{ //do somethong return 1 }当函数只有单个表达式时,可以省略花括号,直接写在=之后,如果返回值类型可由编译器推断

gaiyaguang的博客 8318

Kotlin学习笔记(四) - Lambda表达式

本文章借鉴了其他网络文章资源,仅做个人笔记 1、开篇 以下在main函数中定义了一个名为codeBlock的代码块,可以理解成是一个函数,这个函数接收一个名为f的Int类型参数,函数内部进行了打印操作,同时返回了一个3作为返回值,那么也就是说,codeBlock的返回值类型是Int类型(Kotlin类型自动推断机制),调用该函数,传入2,并用result接收函数的返回值,再打印result,可以发...

qq_17767113的博客 318

疯狂Kotlin讲义学习笔记06章:函数、lambda表达式

1、定义和调用函数及函数返回值Unit fun 函数名 (形参列表) : 返回值类型{ 函数体 } 可以省略返回值类型 如果返回值类型为:Unit则为无返回值,等同于java的void 2、递归函数 fun main() { var n=5 var resualt= jiechen(n) println(resualt) } fun jiechen(n:Int):Int{ if (n==1){ return 1 }else{ return

weixin_43745804的博客 358

Kotlin学习笔记——(七)lambda表达式与高阶函数

注:编码工具为IntelliJ 目录 函数类型变量 函数类型变量声明 函数变量自动类型推断 函数类型变量声明结合实现 函数类型变量的两种调用方式 某种数据类型的扩展函数类型变量 正常定义的函数返回值 将普通函数用函数引用赋值给变量 嵌套 高阶函数初探 笔记二里面记录过匿名函数和lambda表达式,这节稍微展开记录一些相关的定义和使用。 函数类型变量 Kotlin中函数可以作为一种类型,可以定义变量,可以将匿名函数,也即lambda表达式赋值给函数类型变量。 函数...

miyuexingchen的专栏 494
上一篇: 开发台组件扩展——矩形 和 圆
下一篇: 开发台组件扩展——RTC时钟
LiePy
博客等级 码龄7年 1927粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值