示例:
运行效果:
上面5个函数,推荐优先使用let、also、use这三个。
use主要用于IO操作、数据库操作等最后需要关闭的场景下,因为在“use”的内部已经帮我买处理了很多事情,比如try抛异常,比如关闭IO流:
var list:List<String>
File("KotlinDemo.iml").inputStream().reader(Charsets.UTF_8).buffered().use {
list = it.readLines()
println("KotlinDemo.iml的内容是:\n${list.joinToString()}")
}
list.forEach {
println("每一行的内容是:$it")
}
结果如下:
在Java里面,通常有这样的场景:当某个对象不为空的时候,执行A逻辑;对象为空的时候则执行B逻辑。这时候我们通常是通过if(){ … }else{ … }来实现。
在kotlin里面,我们则是可以省去这样的麻烦,直接用上面提到的几个高阶函数来完成这样的功能需求:
我们先定义如下的一个可空变量,并不初始化:
var target:String? = null
然后执行如下逻辑:
target?.apply {
println("target不为空时执行apply:$this")
}?: run {
println("target为空时执行run")
}
target?.run {
println("target不为空时执行run:$this")
}?: run {
println("target为空时执行run")
}
target?.also {
println("target不为空时执行also:$it")
}?: run {
println("target为空时执行run")
}
运行效果如下:
可以看到,上面四个函数,都是执行了
?: run { ...... }
里面的逻辑。
现在我们再来完成对target的初始化并赋值:
target="秋水浮萍任缥缈"
然后是同样的执行上面的代码,结果如下:
这时,我们可以看到。四个高阶函数,分别执行的是:
?.apply { ...... }、
?.run { ...... }、
?.also { ...... }、
?.let { ...... }
里面的逻辑。因此我们可以总结如下:
当一个对象为空时,会执行
?: run { ...... }
里面的逻辑 ,当对象不为空时,会执行
?.apply { ...... }、
?.run { ...... }、
?.also { ...... }、
?.let { ...... }
里面的逻辑。通过这个,我们可以用它来实现对if(){ … }else{ … }的替代。
小结: