前言
对于网上的解释大多比较零散,所以写这篇文章方便一目了然
java中对象是一等公民,对象有状态,函数是没有状态的,调用完毕后,里面的数据会被回收,不会被保存
Kotlin 函数是一等公民,这意味着它们可以存储在变量与数据结构中、作为参数传递给其他高阶函数以及从其他高阶函数返回。可以像操作任何其他非函数值一样操作函数。
为促成这点,作为一门静态类型编程语言的 Kotlin 使用一系列函数类型来表示函数并提供一组特定的语言结构,例如 lambda 表达式
java与kotlin对比
首先我们来看一个例子:
public class Test {
public void test(){
public void test(){
}
}
}
这里很明显在java中是会报错的,因为方法里面放方法是不可行的,java函数是二等公民,二等公民是不可以出现在函数里面的。他只能出现在类的定义里
fun test() {
val str = ""
fun getStr(): String {
return str
}
}
再来看这个例子,kotlin中这个方法却是正确的,因为上面已经解释到这个原因,函数是一等公民,可以在任何地方使用,这样使用的好处有:
- 可以在函数的内部声明函数
- 函数参数可以是函数
- 函数的返回值可以是函数
高阶函数
高阶函数:就是可以把函数作为参数传入,或者作为返回值的函数就是高阶函数
Lambda
对于Lambda的表述我这里不做过多的解释,网上有大量的解读
Lambda的标准表达式:
{ a: Int, b: Int -> a + b }
kotlin中的Lambda也可以这样写:
val sum: (a: Int, b: Int) -> Int = { a: Int, b: Int -> a + b }
或者
val sum: (Int, Int) -> Int = { a, b -> a + b }
上面的表达式表示传入两个int类型的数据然后对这个两个数据做相加的操作并返回,再举例子如下:
fun main(args: Array<String>) {
var value = 0
var localValue = 20
val result = { a: Int ->
value += 1
localValue += 1
val c = value + localValue + a
println(c)
}
result(30)
println(value)
println(localValue)
}
结果:
52
1
21
kotlin闭包
闭包的概念
函数里面声明函数,函数里面返回函数,就是闭包
闭包的作用有:
- 函数内部的局部变量的状态保存住了(变量的值就是状态)
- 闭包能够读取其他函数内部变量的函数
文章一开始kotlin与java对比的例子其实就是一个闭包!
我们看看例子:
fun test2(): () -> Int {
var str = 0
return fun(): Int {
return str++
}
}
fun main(args: Array<String>) {
val makeFun= test2()
println(makeFun())
println(makeFun())
println(makeFun())
println(makeFun())
}
结果:
0
1
2
3
代码解释:方法test2是一个没有参数的函数,返回的是一个Lambda表达式,内部有一个str的int变量,函数内部返回的也是一个函数,这个函数对str做了加的处理。由结果可以看出,内部的str变量是得到了数据的保存的,如果是java则运行一次后就会清除掉,所以这就是闭包保存值的作用,并且我们打印出来了这个值可以表示我们可以访问kolin函数内部的变量
kotlin中闭包、Lambda、高阶函数同时使用的例子
class C {
fun test(a: Int, b: (Int) -> Int): () -> Int {
return fun(): Int {
return a + b(a)
}
}
或者
fun test(a: Int, b: (Int) -> Int): () -> Int {
return {
a + b(a)
}
}
}
fun main(args: Array<String>) {
val c = C()
val d = c.test(1) { a -> a + 1 }
println(d())
}
结果:
3
在kotlin中有个小技巧,如果传入的最后一个参数是一个函数的话,可以将函数移到圆括号外,如果参数传入的只有一个函数,那可以去掉这个圆括号,所以:
val d = c.test(1) { a -> a + 1 }
等价于
val d = c.test(1,{ a -> a + 1 })
网友评论