引言
kotlin中函数是第一公民,一切皆函数。那么函数就会用的很多了,但是又看到高阶函数。?????这又是什么意思,还是要从基础看起。
正文
函数
基础函数
// 无参也无返回值的函数
fun function(){
println("this is function!")
}
fun main(){
function() // 调用函数
}
// function
fun function(param: Int): Int {
return param + 1
}
fun main(){
val result = function(0)
println(result)
}
fun add(a: Int, b: Int): Int {
return a + b
}
fun main(){
val result = add(2, 3)
println(result)
}
函数重载和默认参数
Java允许参数个数,参数类型不同的函数重名存在,kotlin也有这个概念存在。
在kotlin中,不会写很多同名的不同参数函数,这就太麻烦了。
默认参数就可以很好的解决该问题
fun function(param0: Int, param1: Int = 0, param2: Int = 0, param3: Int = 0) {
println("param0 is $param0 param1 is $param1 param2 is $param2 param3 is $param3")
}
fun main() {
function(1)
function(1, 2)
function(1, 2, 3)
function(1, 2, 3, 4)
}
aram1: Int = 0
,如果param不赋值,那么默认值就是0,通过默认参数,直接就完成了四个重载函数的功能。是不是很简便。
main函数
kotlin和java一样也有程序入口,那就是main函数
// 无参数的main函数
fun main() {
println("hello world !")
}
// 带参数的main函数
fun main(args: Array<String>) {
println("hello world !")
}
单表达式函数
kotlin函数的一般写法:
fun function(a: Int, b: Int): Int {
return a + b
}
下面一切皆函数的重点来了,函数返回结果赋值。简写:
// a+b相当于返回值
fun function(a: Int, b: Int): Int = a + b
fun main() {
val result = function(2, 3) // 单表达式函数
println(result)
}
高阶函数
高阶函数是kotlin相对于Java所独有的,所谓的高阶函数就是以另一个函数作为参数或返回值的函数。
实际应用中对标 java的接口回调。kotlin直接把函数做为参数。结构体里面,invoke调用函数。触发。
这个结构体就会引出概念闭包。
闭包是什么????
闭包主要是在函数式编程语言中,比如JavaScript,简单来说就是"函数可以访问由函数内部定义的变量",Java也有类似的不完整的使用。
protected void onCreate(Bundle savedInstanceState) {
......省略代码
int var = 0; // 需要加上final
button.setOnClickListener(v -> {
var ++;//报错
});
}
上面会直接报错,var必须是一个final修饰的变量,这里var变量之所以必须是final,是因为var是栈空间的局部变量,一旦出栈,var空间就被释放掉,用final修饰后,该变量就被存储在方法区中,这样var的生命周期是整个程序的生命周期。
但是用final修饰后,var也不能自增,所以可以有下面的解决办法,用一个数组代替var:
protected void onCreate(Bundle savedInstanceState) {
......省略代码
int[] varArray = new int[]{1};
button.setOnClickListener(v -> {
varArray[0]++;//正确
});
}
这个时候varArray是分配在堆空间上,自然也就没有上面代码的问题了。
kotlin闭包写法:
override fun onCreate(savedInstanceState: Bundle?) {
......省略代码
var variable = 0;
button.setOnClickListener {
variable++ //正确
}
}