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

news/2024/10/22 17:21:55/

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.ppmy.cn/news/1152013.html

相关文章

华为云云耀云服务器L实例评测|华为云耀云服务器L实例私有库搭建verdaccio(八)

九、华为云耀云服务器L实例私有库搭建verdaccio: Verdaccio 是一个简单的、零配置本地私有 npm 软件包代理注册表。Verdaccio 开箱即用,拥有自己的小型数据库,能够代理其它注册表(例如 npmjs.org),缓存下载…

spring:详解spring boot

spring的优缺点 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配 置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入 了…

【重拾C语言】十、递归程序设计

目录 前言 十、递归程序设计 10.1 计算n!——递归程序设计 10.2 程序设计实例 10.2.1 汉诺塔 10.2.2 齿轮 10.2.3 组合 10.3 计算算术表达式的值——间接递归 10.4 递归程序执行过程 前言 递归程序设计是一种编程技术,其中一个函数通过调用自身…

TiDB部署及常用命令

TiDB是一个分布式数据库系统,具有高可用性、可扩展性和兼容性等特点。下面是一个TiDB的部署方案及常用命令50条。 一、TiDB部署方案 安装TiUP:TiUP是一个TiDB生态系统的集成管理工具,你可以使用它来安装和管理各种TiDB组件。 curl --proto h…

VR虚拟现实在室内设计仿真教学中的应用演示

1. 虚拟实景漫游:利用VR技术,学生可以通过戴上VR头盔来进入一个虚拟的室内环境中,感受真实的空间氛围。他们可以自由移动和观察,感受室内设计的效果。这样的体验可以增强学生的想象力和空间感知能力,提高他们的设计水平…

html设置前端加载动画

主体思路参考: 前端实现页面加载动画_边城仔的博客-CSDN博客 JS图片显示与隐藏案例_js控制图片显示隐藏-CSDN博客 1、编写load.css /* 显示加载场景 */ .loadBackGround{position: absolute;top: 0px;text-align: center;width: 100%;height: 100vh;background-c…

FL Studio21汉化破解版注册机

FL Studio汉化破解版 V21是一款活跃在音频编辑领域的软件,它的中文名为水果音乐制作软件,是能向用户提供全能型音乐制作环境和数字音频工作站的应用程序。有了它,用户可轻松完成编曲、混音、录音和剪辑等工作,外加上漂亮的大混音盘…

npm安装依赖报错npm ERR! code ENOTFOUND npm ERR! errno ENOTFOUND、npm run dev报错记录

npm安装依赖报错npm ERR! code ENOTFOUND npm ERR! errno ENOTFOUND_得我所得,爱我所爱的博客-CSDN博客npm安装依赖报错今天在学习webpack的时候,在使用npm install来安装一个局部的webpack时候,报出一下错误:npm ERR! code ENOTFOUNDnpm ERR…