前面觉得函数没有什么特别的,看一眼就懂了,但是后面发现,还有有一些东西如果知道了,可以提高编程效率,而且内容还不少,建立一个专题来学习一下。
标准函数
let函数
在Kotlin中,let
函数是一个作用于任意对象的函数。它允许您在函数块中对对象进行操作,并返回最后一个表达式的结果。let
函数的使用场景包括在对象非空时执行操作、链式调用函数以及在函数式编程中进行数据转换等。
let
函数的语法为:
object.let { variable ->
// 在这里可以对 variable 进行操作
// 返回最后一个表达式的结果
}
在let
函数中,object
表示要操作的对象,variable
表示在函数块中引用该对象的变量名。您可以在函数块中对variable
进行操作,然后返回最后一个表达式的结果。
下面是一个使用let
函数的示例代码:
fun main() {
val name: String? = "Alice"
val length = name?.let {
println("Name is not null: $it")
it.length
} ?: 0
println("Length: $length")
}
在上述代码中,我们定义了一个可空的字符串变量name
,并使用let
函数对其进行操作。
在let
函数块中,我们首先打印出非空的name
值,然后返回其长度。
在let
函数的调用链中,我们使用了安全调用运算符?.
,以确保在name
为空时不会调用let
函数。
最后,我们将let
函数的结果赋值给length
变量,并打印出length
的值。
运行上述代码,输出结果为:
Name is not null: Alice
Length: 5
从输出结果可以看出,let
函数在name
不为空时被调用,打印出非空的name
值,并返回其长度。最后,我们将长度赋值给length
变量,并打印出length
的值。
上面的例程如果看着比较吃力的话,那么你需要了解一下《第一行代码Android》kotlin总结之Lambda 和 《第一行代码Android》kotlin总结之空指针检查
with、run 和 apply 函数
这三个函数的用法很类似,只是有稍微区别,所以放到一起来学习了。下面的例子都来源于《第一行代码 Android》
with函数
with函数的第一个参数是这个StringBuilder,然后整个lambda的上下文都是这个StringBuilder。并且lamda的最后一行会作为with函数的返回值。
val list = listOf("apple", "orange", "banana")
val result = with(StringBuilder()) {
append("start eat\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("eat finished\n")
toString()
}
run函数
和with函数基本没有变化,就是换了一个实现的方式而已
val list = listOf("apple", "orange", "banana")
val result = StringBuilder().run {
append("start eat\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("eat finished\n")
toString()
}
apply函数
有一个主要的区别就是apply返回的是对象本身,即下面例子的StringBuilder
val list = listOf("apple", "orange", "banana")
val result = StringBuilder().apply{
append("start eat\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("eat finished\n")
}
定义静态函数
最简单的类似静态函数
注意只是类似哈,不是真正的静态函数,但是调用起来是静态函数的调用还是很像的。
object Util1 {
fun doSomething() {
//xxx
}
}
我们使用的时候,可以直接Util1.doSomething()
来调用
伴生类方式调用
当然了上面单例的方式,整个Util中的函数都可以通过Util.xxx()
的方式调用。如果我们只想实现单个函数的调用呢
class Util2 {
fun doSomething1() {
//xxx
}
companion object {
fun doSomething2() {
//xxx
}
}
}
companion 这个关键字会在Util2 的内部创建一个伴生类,kotlin会保证Util2 中只有一个伴生对象。因此就可以通过Util2.doSomething2()
.而Util2.doSomething1()
是不行的
真正的静态函数
- 给函数加上 @JvmStatic注解,在编译的时候就会真正编译为一个静态函数。这个注解只能添加到单例类或companion object 方法的注解上面。
class Util {
fun doSomething1() {
//xxx
}
companion object {
@JvmStatic
fun doSomething2() {
//xxx
}
}
}
- 在没有任何类中的方法,编译器会把它编译为静态方法。即在一个文件中只有函数,没有任何类