Kotlin --- 函数,高阶函数

2024-01-02 04:04:35

引言

? 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++ //正确
        }
    }

文章来源:https://blog.csdn.net/wulong756273/article/details/135328909
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。