三、在Kotlin中使用Lambda

【Kotlin】Kotlin的高阶函数与Lambda表达式 前言 Kotlin的高阶函数与Lambda表达式是Kotlin的特色,使用频率非常高。熟悉它的用法与本质对于简化代码、提升开发效率非常有帮助,也易于阅读kotlin的框架源码。 这两个概念并不是一个东西,但是又有非常紧密的关联。这篇文章带你弄懂什么是高阶函数,以及Lambda表达式的本质和使用。 一、什么是高阶函数 高阶函数就是将函数用作参数或返回值的函数。 函数类型 Kotlin 使用类似 (Int) -> String 的一系列函数类型来处理函数的声明,例如onClick: val onClick 阅读详情

Lambda表达式


基本语法结构

{参数名 1 : 参数类型 , 参数名 2 :参数类型 -> 函数体 }

“->”前的部分为参数列表,后面的是函数体。

参数列表为传入Lambda的数据信息。

函数体为逻辑代码,并且最后一行代码会自动作为Lambda表达式的返回值。


使用案例 1

定义一个List,存放各种水果的名字,通过使用maxBy函数 和 Lambda表达式来查找出List中名字最长的水果是哪一个。

测试代码 1

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
	val lambda = {fruitName:String -> fruitName.length}
    
    val maxLengthFruit = list.maxOf(lambda)
    
    println(maxLengthFruit)
    
    
}

输出结果:

6

 

 

测试代码1中,为了清晰,我们将lambda表达式单独提取出来作为一个变量,其实,我们可以省去这个变量,直接将lambda表达式传入maxBy函数中。所以,我们可以做如下简化:

 

测试代码 2

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
	//val lambda = {fruitName:String -> fruitName.length}
    
    val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})
    
    println(maxLengthFruit)
    
    
}

 

然后Kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面,因此可以对测试代码2进行简化:

测试代码 3

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
	//val lambda = {fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package
    
    val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length}
    
    println(maxLengthFruit)
    
}

 

Kotlin还规定,如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略,所以测试代码 3可以进一步简化:

测试代码 4

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
	//val lambda = {fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package
    
    //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length}
    
     val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length}
    
    println(maxLengthFruit)
    
}

 

由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型,因此代码可以进一步简化成:

测试代码 5

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
	//val lambda = {fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package
    
    //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length}
    
    val maxLengthFruit = list.maxOf{fruitName-> fruitName.length}
    
    println(maxLengthFruit)
    
}

 

当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替,所以,代码可以最终简化为:

最终代码

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
    
	//val lambda = {fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf({fruitName:String -> fruitName.length})package
    
    //val maxLengthFruit = list.maxOf(){fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf{fruitName:String -> fruitName.length}
    
    //val maxLengthFruit = list.maxOf{fruitName-> fruitName.length}
    
    val maxLengthFruit = list.maxOf{it.length}
    
    println(maxLengthFruit)
    
}

 


使用案例 2

还是一个List,里面还是存放一些水果的名字,先将其中的名字字符长度小于等于5的水果的名字全部变成大写字母拼写:

fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
    
	val newList = list.filter{it.length<=5}.map{ it.toUpperCase() }
    
    for(fruit in newList){
        println(fruit)
    }
    
}

输出结果: 

APPLE
PEAR

filter函数会对list中的元素根据Lambda中的规则进行过滤,然后map函数会根据Lambda中的规则进一步映射出一个新的集合。


使用案例 3

一个List,存放各种水果的名字,先判断:

  1. 其中是否存在字符串长度为10的水果名字。
  2. 其中是否所有的水果名字字符串长度都大于2.
fun main(){
    val list = listOf("Apple","Banana","Orange","Pear")
    
	val isAnyRes = list.any{ it.length >10 }
    val isAllRes = list.all{ it.length >2 }
   
   	println("isAnyRes : "+isAnyRes)
    println("isAllRes : "+isAllRes)
    
}

输出结果:

isAnyRes : false
isAllRes : true

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第080篇 Lambda 语法精讲:it、尾随 lambda 与隐式接收者 Lambda 体里的。 阅读详情

相关推荐

PADS Layout差分对布线实战:从规则设置到高速信号优化

本文详细讲解了在PADS Layout中进行差分对布线的完整实战流程。从在Layout中定义差分对网络,到进入Router配置线宽、间距等关键规则,再到布线实战技巧与高速信号完整性优化,系统阐述了如何确保差分信号(如USB、HDMI)的稳定传输,是高速PCB设计的核心技能。

weixin_29274969的博客 520

在Kotlin中使用lambda

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

养生阿华田 692

等保2.0下可信验证的动态实现与合规实践

本文深入解读等保2.0标准中的“可信验证”要求,并重点探讨其动态实现与合规实践。文章阐述了从可信根、信任链到动态验证的核心概念,拆解了不同安全等级的实施差异,并提供了从硬件选型、软件赋能到平台集成的四步落地指南。通过行业案例与避坑心得,为构建覆盖计算环境、区域边界、通信网络和安全管理中心的全链条可信防御体系提供了实用参考。

d3e4f的博客 827

Kotlin知识归纳(五) —— Lambda

前序 在Kotlin中,函数作为一等公民存在,函数可以像值一样被传递。lambda就是将一小段代码封装成匿名函数,以参数值的方式传递到函数中,供函数使用。 初识lambda 在Java8之前,当外部需要设置一个类中某种事件的处理逻辑时,往往需要定义一个接口(类),并创建其匿名实例作为参数,具体的处理逻辑存放到某个对应的方法中来实现: mName.setOnClickListener(new View.OnClickListener() { @Override ...

zhangmiaoping23的专栏 3676

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader+Application双备份(含完整代码解析)

本文详细介绍了基于STM32F103VET6微控制器和W25Q64外部Flash实现Bootloader+Application双备份固件升级的完整方案。通过精心设计的Flash分区策略、可靠的Bootloader程序以及包含双重校验和自动回滚机制的升级流程,有效解决了远程升级过程中断电导致设备变砖的风险,确保了工业嵌入式系统的高可靠性与稳定性。

linux的博客 823

从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据

本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。

weixin_30607659的博客 281

Kotlin - Lambda表达式(匿名函数)

同样支持SAM转换。底层是将Java的SAM翻译成函数类型。

HugMua的博客 3943

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

Kotlin中的lambda从入门到进阶

lambda表达式是Kotlin函数式编程的一个重要概念,是函数式编程的基础,在kotlin中函数是一等公民,而lambda则是其灵魂。lambda本质上是可以传递给函数的一小段代码, 是一个函数类型的对象,本文主要从浅入深介绍下kotlin中的lambda以及跟java lambda的区别。

Android茶话会 3112

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 737

产品需求从场景,初始需求IR,产品需求 OR,设计需求DR,设计规格DS的具体案例说明,以扫地机产品为例

摘要: 以扫地机器人"宠物粪便避障"功能为例,说明从用户场景到产品落地的完整需求转化路径。初始需求(IR)源于养宠家庭痛点,要求100%避障并自动告警;产品需求(OR)转化为≥98%识别准确率等量化指标;设计需求(DR)拆解为感知、决策、执行三大技术模块;最终形成传感器选型(如索尼IMX678)、芯片规格(高通QCS6490)等设计规格(DS)。通过实验室模拟和用户测试验证,该功能使产品溢价30%,养宠家庭购买占比达52%,实现技术与商业价值的统一。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 765

Kotlin——高级篇(一):Lambda表达式详解

经过前面一系列对Kotlin讲解,相信大家已经能对Kotlin有了一个基本的认识。如果你又Java语言方面的编程经验,你可能已经不满足前面的基础语法了。从这篇文章起,就为大家讲解Kotlin语言中的高级操作。 Lambda语法在Java中已经被广泛的运用,我们在开发Android中几乎上每一个项目也会在项目中接入Lambda插件,因为Lambda确实能简少很多的代码量。无独有偶,在Kotlin中...

weixin_30376453的博客 896

【Unity Shader】Special Effects(十二)Glow 外发光(UI)

Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。

神码编程 931

Kotlin开发三 kotlin中的lambda表达式

1 Lambda表达式定义 kotlin中lambda表达式定义如下: {param1:Type,param2:Type… -&gt; ….} 例子 {x:Int,y:String -&gt; y.length + x} 就是一个lambda表达式 在kotlin中如果要直接运行lambda,可以使用run{}来运行 run{45} 2 kotlin中lambda表达式的约定 kotlin中...

带你装逼带你飞的专栏 3029

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Kotlin学习三:集合与Lambda

List 创建于遍历 创建一个只能读的集合,不能添加、修改或删除集合内容: val myList = listOf("A", "B", "C") for (i in 0 until myList.size) { Log.w("列表", "" + myList.get(i)) } 创建一个可以修改的集合: val myList = mutableListOf("A", "B", "C") myL

wuqingsen1的博客 327

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kotlin学习(三):Lambda编程

3.1 集合创建与遍历 3.1.1 List和Set集合 传统意义上,集合主要是List和Set,再广泛一点,还有Map这样的键值对数据结构。这些在Java中都是接口,List主要实现类是ArrayList和LinkedList,Set的主要实现类是HashSet,Map的主要实现类是HashMap。 现在需要创建一个包含许多水果名称的集合,在Java中: var list = ArrayList<String>() list.add("apple") list.add("banana") li

qq_43729929的博客 207

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Kotlin-简约之美-进阶篇(三):Lambda的使用详解

文章目录Lambda介绍Lambda的使用Lambda表达式的特点Lambda语法实例讲解:Lambda实践it下划线(_)匿名函数带接收者的函数字面值闭包android实战 Lambda语法在Java中已经被广泛的运用,我们在开发Android中几乎上每一个项目也会在项目中接入Lambda插件,因为Lambda确实能简少很多的代码量。无独有偶,在Kotlin中也是支持Lambda语法的,在这篇文...

门心叼龙的专栏 6100

Kotlin 中 Lambda的使用 三、SAM转换 (Single Abstract Method Conversions)

一、函数式接口 只定义了一个抽象方法的接口称为函数式接口(SAM接口)。函数式接口可以有多个非抽象方法,但只能有一个抽象方法。比如:java中 public interface OnClickListener { void onClick(View v); } kotlin中(kotlin 1.4 之前不支持函数式接口,1.4之后才支持):通过关键词 fun 声明 @FunctionalInterface fun interface OnC...

old_land的博客 797

Kotlin学习笔记(三)--Lambda编程

文章目录1. 集合的创建和遍历2. 集合的函数式API2. 1 1. 集合的创建和遍历 集合的函数式API是用来入门Lambda编程的绝佳示例。所以下面我们先通过一个简单的列子来学一下kotlin中的集合。 需求:创建一个包含许多水果名称的集合。 传统写法: val list = ArrayList<String>() list.add("apple") list.add("orange") list.add("grape") list.add("pear")

langlitaojin的博客 334

Kotlin笔记 六(三) Lambda表达式.md

Lambda表达式# 1、定义 Labmbda表达式总是被大括号括这 定义lambda表达式不需要fun关键字,无须指定函数名 形参列表位于“-&amp;amp;gt;”之前声明,参数类型可以省略 函数体位于“-&amp;amp;gt;”之后 函数体的最后一个表达式自动作为Lambda表达式返回值,无须使用return关键字 如: {a:Int,b:Int-&amp;amp;gt; a*b} {it* it} 当只有一个形参时,可以...

Leslie_LN的博客 487

Kotlin语法学习(三)_Lambda编程

Kotlin语法学习(三)_Lambda编程

weixin_45809829的博客 645

Android Kotlin 从入门到精通(三、方法 Lambda表达式)

3、第一次循环 下标index为0 值为1 在action方法中1*0返回0赋值给newValue。2、在for循环中遍历,将数组的下标和值传入action方法中(index*element)4、再将array数组中下标为index 的位置替换成newValue中的值 直到循环结束。5、这样得到的新数组array中的值为{0,2,6,12}1、将数组(1,2,3,4)传入transfrom中。这个地方对新学者比较难理解,解释下运行流程。

weixin_44873906的博客 218

Kotlin

不需要 ;作为结尾 类型推断 Kotlin没有三元操作符 a>b?a:b代码简洁: 函数返回值写成表达式主体,代码中的最后一个表达式就是结果 用when代替if else lambda 不使用分号结尾 不需要很多的函数重载。可以指定参数的默认值,而且可以通过使用命名参数,可以指定参数来调用函数

u011809807的博客 277

【Kotlin】高阶函数和Lambda

Kotlin天然支持了部分函数式特性。我们可以在一个函数内部定义一个局部函数。 抽象和高阶函数 在我们以往熟悉的编程中,过程限制为只能接收数据为参数由于我们经常会遇到一些同样的程序设计模式能够用于不同的过程,比如一个包含了正整数的列表,需要对它的元素进行各种转换操作,例如对所有元素都乘以3,或者都除以2。我们就需要提供一种模式,同时接收这个列表及不同的元素操作过程,最终返回一个新的列表为了把这种类似的模式描述为相应的概念,我们就需要构造出一种更加高级的过程,表现为:接收一个或多个过程为参数,或者以一个过程作

xoliu的博客 2484

Kotlin Lambda

用最直白的语言来阐述的话,Lambda就是一小段可以作为参数传递的代码。通常不建议在Lambda表达式中编写太长的代码,否则可能会影响代码的可读性。语法结构{参数名1: 参数类型, 参数名2: 参数类型…… -> 函数体}Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用一个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码(虽然不建议编写太长的代码),并且最后一行代码会自动作为Lambda表达式的返回值。

canada_numbfish的博客 1506

Kotlin中的Lambda

最近在网站上看了看Lambda表达式在Kotlin中的使用,借鉴了大牛一些讲解的内容,这里简单记录了下重点内容,先看下目录 1.Lambda介绍 Lambda表达式属于函数式编程语言,区别于Java面向对象编程语言。它本质是`匿名函数,因为底层就是匿名函数实现的。 2.Lambda的使用 2.1Lambda表达式的特点 Lambda表达式总是被大括号包裹着,箭头前面是参数(可有可无),参数类型可以省略,箭头后面是函数体。 2.2Lambda的语法 无参: var noParamM.

木头小颖的博客 1758
上一篇: 一. 继承和构造函数(Kotlin)
下一篇: Java函数式API的使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值