标准函数是指Standard.kt文件中定义的函数
let函数提供了函数式API编程接口,并将原始对象作为参数传递到Lambda表达式中,标准的写法如下:
obj.let { obj1->需要执行的逻辑 }
obj1就是obj对象这里写成obj1只是为了防止命名重复的问题,使用的场景如下:
fun doStudy(study: Study?) { study?.readBook() study?.doHomeWork() }
上面代码相当于每次调用Study对象的方法,都需要对study进行判空,我们可以使用let函数配合?.即可解决这个问题。
fun doStudy(study: Study?) { study?.let { it.readBook() it.doHomeWork() } }
with函数接收两个参数:
with函数会在Lambda表达式中提供第一个参数对象的上下文,并将Lambda表达式最后一行代码作为返回值返回。
val list= listOf<String>("Apple","Banana","Orange","Pear","Grape") val builder=StringBuilder() builder.append("Start eating fruit \n") for(fruit in list){ builder.append("$fruit \n") } builder.append("Ate all fruit") val result=builder.toString() println(result)
仔细观察上面代码,我们多次使用builder对象调用append()进行字符串的拼接,这个时候我们就可以使用with函数来简化这个过程。
val list= listOf<String>("Apple","Banana","Orange","Pear","Grape") val result=with(StringBuilder()){ append("Start eating fruit \n") for(fruit in list){ append("$fruit \n") } append("Ate all fruit") toString() } println(result)
run函数的使用场景和with函数的使用场景一样,只不过用法上有点差别。
val list=listOf("Apple","Banana","Orange","Pear","Grape") val builder=StringBuilder() val result=builder.run { append("Start eating fruit \n") for(fruit in list){ append("$fruit \n") } append("Ate all fruits") toString() }
和with函数基本一致,只不过是将调用with函数传入StringBuilder对象改成了StringBuilder对象调用run函数。其他没有什么区别。
apply函数和run函数也是极其相似的,都是在某个对象上使用并且只接受一个Lambda表达式参数,调用对象作为Lambda表达式的上下文,不同的是apply函数无法指定返回值,而是返回调用对象本身。示例如下:
val list=listOf("Apple","Banana","Orange","Pear","Grape") val builder=StringBuilder() val result=builder.apply{ append("Start eating fruit \n") for(fruit in list){ append("$fruit \n") } append("Ate all fruits") } println(result.toString())
由于apply函数无法指定返回值,只返回调用对象本身,所以这里的result是StringBuilder对象。
repeat函数接收2个参数,第一个参数是Int类型的,第二个参数Lambda表达式。第一个参数的意思表示的是指Lambda表达式中内容执行的次数。
val list=ArrayList<String>() repeat(2) { list.add("1") list.add("2") } //集合中的数据就是1,2,1,2
可以看到1,2添加了2遍。
also函数接收一个参数Lambda表达式。可以在表达式执行前进行非null校验,传入参数为it,返回值固定为this自身类型
val list=listOf("Apple","Banana","Orange","Pear","Grape") val builder=StringBuilder() val result=builder?.also{ it.append("Start eating fruit \n") for(fruit in list){ it.append("$fruit \n") } it.append("Ate all fruits") } println(result.toString())
只返回调用对象本身,所以这里的result是StringBuilder对象。
在Kotlin中实现静态方法反而没那么简单,实现方式如下:
object SIngleInstance { fun doAction(){} } //调用也简单 SIngleInstance.doAction()
看上去是不是和Java中调用静态方法一样,其实Kotlin内部已经创建了唯一的SIngleInstance对象,然后使用对象调用doAction()方法,不过使用单例类的方法就会使类中的所有方法的调用全部变成了类似于静态方法调用的方式了。那么能不能只指定一个或部分方法变成静态方法的调用,这时候就需要companion object了。
fun doAction1(){} companion object { fun doAction2(){ println("do action2") } } }
普通类Util中有2个方法doAction1()和doAction2(),他们还是有很大区别的,doAction1()的调用必须使用Util类的对象来调用,而doAction2()可以直接使用Util .doAction2()调用。
不过doAction2()其实也不是静态方法,companion object这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2()这个方法就是定义在这个伴生类里面的实例方法,只不过Kotlin保证Util类只会存在一个伴生类对象,因此调用Util.doAction2()实际上调用Util类中伴生类对象的doAction2()。
由此可以看出Kotlin确实没有定义静态方法的关键字,但是提供了一些语法特性来支持静态方法调用的写法。
注解方式实现静态方法只能用在单例类中或companion object关键中,下面我们在companion object关键中加上注解@JvmStatic:
companion object { @JvmStatic fun doAction2(){ println("do action2") } }
顶层方法是指那些没有定义在任何类中的方法,Kotlin编译器会将所有顶层方法编译成静态方法。比如我们在新建的Kotlin FileHelper.kt中定义一个doSomething()方法
fun doSomething() { println("do Something") }
HelperKt.doSomething();
这一次的节点更新覆盖了加拿大、欧洲、新加坡、韩国、美国、日本、香港等地区,最高速度可达20.5 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 今天给各位分享厦门市宠物领养中心地址的知识,其中也会对厦门领养宠物猫中心进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、厦门宠物猫在哪买..
这一次的节点更新覆盖了欧洲、新加坡、美国、香港、日本、韩国、加拿大等地区,最高速度可达22.9 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
这一次的节点更新覆盖了美国、香港、新加坡、日本、欧洲、韩国、加拿大等地区,最高速度可达20.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
这一次的节点更新覆盖了香港、新加坡、欧洲、加拿大、美国、韩国、日本等地区,最高速度可达22.4 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
这一次的节点更新覆盖了日本、欧洲、美国、香港、加拿大、新加坡、韩国等地区,最高速度可达22.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
最近面试季节,估计「如何保证缓存和数据库一致性」这个问题经常会被问到,这是一个老生常谈的话题了。 但很多人对这个问题,依旧有很多疑惑: 到底是更新缓存还是删缓存? 到底选择先更新数据库,再删除缓存,
这一次的节点更新覆盖了韩国、加拿大、美国、日本、新加坡、香港、欧洲等地区,最高速度可达18.5 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 今天给各位分享被猫抓了一下红色划痕会传染吗的知识,其中也会对被猫抓了红色划痕有事吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、手背被小.
这一次的节点更新覆盖了新加坡、日本、美国、加拿大、香港、欧洲、韩国等地区,最高速度可达19.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。