Kotlin笔记(一):Lambda,非空判断,函数默认参数

1. Lambda表达式

 Lambda就是一小段可以作为参数传递的代码,在kotlin中的标准形式为:

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

 标准形式使用如下:

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)

1.1 省略Lambda变量

 上面的例子中我们使用了一个变量lambda来记录Lambda表达式,实际上我们可以省略这个变量,直接将表达式传入函数中

val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })

1.2 表达式外移

 当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面

val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }

1.3 省略括号

 如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略

val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }

1.4 省略参数类型

 由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型

val maxLengthFruit = list.maxBy { fruit -> fruit.length }

1.5 省略参数名

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

val maxLengthFruit = list.maxBy { it.length }

 在实际的使用中,可以根据具体的情况采用不同的表达形式


2. 空指针检查

 Kotlin在编译时进行判空检查,默认所有的参数和变量都不为空, 如果需要使用null作为参数,那么需要采用另外一套可为空的参数系统.

2.1 参数类型后面加?表示可以为空

 如:Int? String? Double?

2.2 判空辅助操作符 ?.

 当对象不为空时正常调用相应的方法,当对象为空时则什么都不做,例如:

if (a != null) {a.doSomething()
}

 可以简化为:

a?.doSomething()

2.3 操作符?:

 这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果.

val c = if (a ! = null) {a
} else {b
}

 这段代码的逻辑使用?:操作符就可以简化成:

val c = a ?: b

2.4 将?.和?:操作符结合使用

fun getTextLength(text: String?): Int {if (text != null) {return text.length}return 0
}

 可以简化为:

fun getTextLength(text: String?) = text?.length ?: 0

 首先由于text是可能为空的,因此我们在调用它的length字段时需要使用?.操作符,而当text为空时,text?.length会返回一个null值,这个时候我们再借助?:操作符让它返回0.

2.5 非空断言工具 !!

 在对象的后面加上!!,表示不需要kotlin在此进行非空检查,慎用!!

2.6 let函数

 这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中。示例代码如下:

obj.let { obj2 ->// 编写具体的业务逻辑
}

 这里调用了obj对象的let函数,然后Lambda表达式中的代码就会立即执行,并且这个obj对象本身还会作为参数传递到Lambda表达式中。不过,为了防止变量重名,这里将参数名改成了obj2,但实际上它们是同一个对象,这就是let函数的作用.
 let函数的特性配合?.操作符可以在空指针检查的时候起到很大的作用

fun doStudy(study: Study?) {study?.let { stu ->stu.readBooks()stu.doHomework()}
}

 ?.操作符表示对象为空时什么都不做,对象不为空时就调用let函数,而let函数会将study对象本身作为参数传递到Lambda表达式中,此时的study对象肯定不为空了,我们就能放心地调用它的任意方法了.
 当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可,那么代码就可以进一步简化成:

fun doStudy(study: Study?) {study?.let {it.readBooks()it.doHomework()}
}

 let函数是可以处理全局变量的判空问题的,而if判断语句则无法做到这一点。因为全局变量的值随时都有可能被其他线程所修改,即使做了判空处理,仍然无法保证if语句中的study变量没有空指针风险。从这一点上也能体现出let函数的优势。


3. 函数参数默认值

3.1 设置参数默认值

 kotlin在定义函数的时候给任意参数设定一个默认值,这样当调用此函数时就不会强制要求调用方为此参数传值,在没有传值的情况下会自动使用参数的默认值.

fun printParams(num: Int, str: String = "hello") {println("num is $num , str is $str")
}

 当调用printParams()函数时,可以选择给第二个参数传值,也可以选择不传,在不传的情况下就会自动使用默认值.

3.2 使用键值对方式传参

 如果是第一个参数设定了默认值呢,那我们不想传第一个参数时怎么办呢,如果直接传递第二个参数将会报类型不匹配的错误,这个时候需要使用键值对的方式来进行传参.比如调用printParams()函数,我们还可以这样写:

printParams(str = "world", num = 123)

 此时哪个参数在前哪个参数在后都无所谓,Kotlin可以准确地将参数匹配上.

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

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

相关文章

Android Studio SDK manager加载packages不全

打开Android Studio里的SDK manager,发现除了已安装的,其他的都不显示。 解决方法: 设置代理: 方便复制> http://mirrors.neusoft.edu.cn/ 重启Android Studio

【Java学习之道】TCPIP套接字编程实例

引言 网络编程是Java学习中不可或缺的一部分,而TCP/IP套接字编程又是网络编程的基础。那么,初学者如何才能快速掌握TCP/IP套接字编程呢?今天我们就来通过一个简单的实例,为你揭示TCP/IP套接字编程的奥秘! 一、什么是…

Sql Server 数据库中的所有已定义的唯一约束 (列名称 合并过了)

查询Sql Server Database中的唯一约束 with UniqueBasic as (SELECTtab.name AS TableName, -- 表名称idx.name AS UniqueName, -- 唯一约束的名称col.name AS UniqueFieldName -- 唯一约束的表字段FROMsys.indexes idxJOIN sys.index_columns idxColON (idx.object_id idxCo…

PyTorch 深度学习之循环神经网络(基础篇)Basic RNN(十一)

0.Revision: DNN dense 重义层 全连接 RNN处理带有序列的数据 1. What is RNNs? linear layer 1.1 What is RNN? tanh (-1, 1) 1.2 RNN Cell in PyTorch 1.3 How to use RNNCell *先把维度搞清楚 多了一个序列的维度 2. How to use RNN 2.1 How to use RNN - numLayers…

华为OD机考算法题:服务器广播

题目部分 题目服务器广播难度难题目说明服务器连接方式包括直接相连,间接连接。A 和 B 直接连接,B 和 C 直接连接,则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。 给出一个 N * N 数组,代表 N 个服务器,mat…

PC电脑 VMware安装的linux CentOs7如何扩容磁盘?

一、VM中进行扩容设置 必须要关闭当前CentOS,不然扩展按钮是灰色的。 输入值必须大于当前磁盘容量。然后点击扩展,等待扩展完成会提示一个弹框,点击确定,继续确定。 二、操作CentOS扩容——磁盘分区 第一步设置完成。那就启动 …

docker-compose部署elk(8.9.0)并开启ssl认证

docker部署elk并开启ssl认证 docker-compose部署elk部署所需yml文件 —— docker-compose-elk.yml部署配置elasticsearch和kibana并开启ssl配置基础数据认证配置elasticsearch和kibana开启https访问 配置logstash创建springboot项目进行测试kibana创建视图,查询日志…

微信小程序-3

一、交互 API - - - 界面 - - - 交互 功能&#xff1a;提示 是否删除 1.wx.showToast 显示消息提示框 <button type"primary" bindtapclickBtn>按钮</button> <input style"margin: 20rpx;height: 60rpx;background: gainsboro;" type&…

Docker逃逸---SYS_PTRACE浅析

一、产生原因 用户授予了容器SYS_PTRACE权限&#xff0c;并且与宿主机共享一个进程命名空间(--pidhost)&#xff0c;使得容器内可以查看到宿主机的进程&#xff0c;攻击者可以利用进程注入&#xff0c;反弹shell&#xff0c;从而实现逃逸 二、利用条件 1、容器有SYS_PTRACE权…

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪&#xff0c;默认阈值消噪&#xff0c;强制消噪&#xff0c;给定软阈值消噪方法&#xff0c;数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000

elasticsearch配置

Elasticsearch version: 5.1.1 Windows Java安装 版本&#xff1a;jdk8 Java Archive | Oracle 中国 安装elasticsearch-rtf Elasticsearch-RTF是针对中文的一个发行版&#xff0c;即使用最新稳定的elasticsearch版本&#xff0c;并且帮你下载测试好对应的插件&#xff0c;…

前端架构思考,Vue or React?领域设计、文件结构、数据管理、主题替换

从 Vue 和 React 看问题 Vue 的优势 内置的 vite 构建工具&#xff0c;减少构建时间&#xff0c;提高开发效率&#xff0c;在大工程上特别明显 结构、样式、功能分开的设计&#xff0c;再通过 setup 做 crud 的分隔&#xff0c;整个页面维度的逻辑会特别清晰 在路由和数据管…

ppt怎么压缩到10m以内?分享ppt缩小方法

在日常工作中&#xff0c;我们常常需要制作和分享PowerPoint演示文稿&#xff0c;然而&#xff0c;有时候文稿中的图片、视频等元素会导致文件过大&#xff0c;无法在电子邮件或其他平台上顺利传输。为了将PPT文件压缩到10M以内&#xff0c;我们可以使用一些专门的文件压缩工具…

性能超越 Clickhouse | 物联网场景中的毫秒级查询案例

1 物联网应用场景简介 物联网&#xff08;Internet of Things&#xff0c;简称 IoT&#xff09;是指通过各种信息传感、通信和 IT 技术来实时连接、采集、监管海量的传感设备&#xff0c;从而实现对现实世界的精确感知和快速响应&#xff0c;继而实现自动化、智能化管理。在查…

Npm——yalc本地库调试工具

全局安装 npm i -g yalc本地库发布 yalc publish项目中安装 yalc add 库名本地库更新后推送 yalc push项目中删除库 yalc remove --all

Unity_热更方案

热更是指在游戏已经发布和运行后&#xff0c;仍然能够更新游戏内容、修复错误或添加新功能 具体的来说有几种方法可以实现&#xff1a; 1&#xff1a;UnityWebRequest 和 AssetBundle 这种方法比较基础&#xff0c;但对于一些小型项目或原型来说&#xff0c;是一种有效的热更…

2-k8s-控制器介绍

文章目录 一、控制器类型二、Deployment控制器三、SatefulSet控制器四、Daemonset控制器五、Job控制器六、CronJob 控制器 一、控制器类型 Deployment&#xff1a;适合无状态的服务部署StatefullSet&#xff1a;适合有状态的服务部署DaemonSet&#xff1a;一次部署&#xff0c…

时间复杂度为 O(n^2) 的排序算法

大家好&#xff0c;我是 方圆。对于小规模数据&#xff0c;我们可以选用时间复杂度为 O(n2) 的排序算法&#xff0c;因为时间复杂度并不代表实际代码的执行时间&#xff0c;而且它也省去了低阶、系数和常数&#xff0c;仅代表的增长趋势&#xff0c;所以在小规模数据情况下&…

python:使用卷积神经网络(CNN)进行回归预测

作者:CSDN @ _养乐多_ 本文详细记录了从Excel或者csv中读取用于训练卷积神经网络(CNN)模型的数据,包括多个自变量和1个因变量数据,以供卷积神经网络模型的训练。随后,我们将测试数据集应用于该CNN模型,进行回归预测和分析。 该代码进一步修改可用于遥感影像回归模型. …

14 幂等生产者和事务生产者

kafka消息交付可靠性保障和精确一次语义处理 消息交付可靠性保障&#xff0c;指的kafka对Producer和Consumer要处理的消息提供什么样的承诺。总共就三种&#xff1a;at most once 、at least once、axactly once kafka默认提供的是 at least once。原因是只有Broker提交消息并…