侧边栏壁纸
博主头像
Stars-One的杂货小窝博主等级

所有的创作都是有价值的

  • 累计撰写 276 篇文章
  • 累计创建 46 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录

Kotlin学习快速入门(6)——标准函数的介绍与用法

Stars-one
2020-11-23 / 0 评论 / 0 点赞 / 443 阅读 / 4816 字

Kotlin标准库中提供了几个函数供我们快速调用,极大地提高了开发效率,下面可以了解学习一下

看了网上的文章,都是讲解的十分复杂,把源码也是讲了进去,让基础的人十分云里雾里的

所以,本篇重点讲怎么用,至于原理,可能后面单独出篇文章进行补充说明

let与run

let与run,都可以代码块中返回任意类型的对象(及最后一行写个对象即可,不需要return关键字),唯一不同的是,let中的代码块用it代表其对象本身,run则是用this来代替其本身

var str : String? = "x"

val result = str?.let {
	println(it)
	println(it.length)
	//任意对象都行,无需return关键字
	"result"
}

val result1 = str?.run {
	println(this)
	println(length)
	"result"
}

also与apply

also与apply与上面那组的区别,即不能在代码块中返回对象,但其函数是返回对象本身

当然,你用上面那组let与run在结尾返回本身也是可以的,好像也没有啥规定,唯一的影响可能是代码多了行,影响了代码可读性..

  • alsolet类似,代码块中是it代表本身
  • applyrun类似,代码块中是this代表本身
var str : String? = "x"
val result = str?.also { 
	//这里不能在最后一行写个对象用于返回
}
val result1 = str?.apply {
	//这里不能在最后一行写个对象用于返回
}
println(result) //输出为x
println(result1)//输出为x
方法名代替其本身返回结果类型
letitR
runthisR
alsoitUnit
applythisUnit

PS:R代表任意类型的对象

使用情形

使用情形的话可以根据上面的表格进行分析

let的话适合需要使用到对象自身的逻辑,之后代码块返回某个对象

val stringBuffer = StringBuffer()
val result = stringBuffer.also {
	it.append("hello")
	it.append("xx")
	it.toString()
}

run的话与let类似,不过其适合需要多次使用到对象自身的逻辑,因为this可以省略,所以可以让给代码看起来比较简略,之后代码块返回某个对象

also的话适合需要使用对象自身,需要对自身对象进行相关的修改,且之后也是需要自身

val stringBuffer = StringBuffer()
stringBuffer.also {
	it.append("hello")
	it.append("xx")
}
//下面还是需要stringBuffer这个对象
println(stringBuffer.toString())

apply与also类似,只是由于在代码块中是this,所以默认可以省略,这样看起来比较简略,适合代码块中需要多次使用到自身对象的逻辑

repeat,takeIf,with

repeat

repeat正如其名,是用来循环次数的,比如说我们需要执行10次某段代码,一般来说是想到for循环,而kotlin中比较人性化地考虑到了这点,我们可以直接使用repeat来达到与for循环一样的效果

//下面的代码循环3次输出,输出0 1 2
repeat(3) {
	//it同等于for循环中的i,从0开始
	println(it)
}

takeIf

满足代码块中的条件,返回调用对象,否则返回为null,如下面代码:

val num = 4
//判断4是否能被2整除,能的话,得到4这个数值
val result = num.takeIf { num%2==0 }
println(result)

PS:takeUnlesstakeIf相反

with

与run差不多,可以在代码块中省略this,返回任意类型的数值,不同的是with在如何地方都可以调用,前面无需通过对象.的方式调用,如下面例子:

val result = with(StringBuffer()) {
    append("hhelo")
    append("xx")
    toString()
}.replace("xx","")

println(result)

with比较适合那种使用匿名对象的相关逻辑,利用匿名对象的相关方法,处理完逻辑,之后就把该匿名对象丢弃

其他补充

省略?判空

Kotlin中使用?进行判空处理,当一个对象可为null,IDE检查的语法就会不通过,我们必须写上?.这种方式才能让语法通过

其实,我们可以使用上述的let、run、apply和also**(本文列出的其他函数并未作尝试)**来进行判空验证,从而避免进行过多的写?.

如有这样一个例子:

val stringBuffer: StringBuffer? = null
//这里必须使用?.
stringBuffer?.append("hello")
stringBuffer?.append("xx")

上面的情况还好说,如果是多一点的话,我们都要写上?,岂不是要烦死?于是我们可以这样写:

val stringBuffer: StringBuffer? = null
stringBuffer?.apply { 
    append("hello")
    append("xx")
}

参考

0

评论区