what?函数的创建只要一行代码(Kotlin中的函数)
# 一、前言
先展示一下Kotlin创建的一个一行代码的斐波那契数列的函数,至于用到的特性文末给出
fun fibSeries(n:Int) :Int = if (n <= 2) 1 else fibSeries(n-1) + fibSeries(n-2)
斐波那契数列算是最经典的递归函数之一,虽然其他语言可能也可以实现(加大括号的不算,如果这样有些语言的代码几乎都可以折叠成一行,比如c、java等等,但对python那是硬伤)
# 二、函数的参数
Kotlin中函数的参数定义为:
变量名:类型
例如:
a:Int
s:String
2
3
4
默认参数是常量即val类型的,即不可在函数里面对参数进行修改
# 1.默认参数
当省略某些参数时可以用默认值替代,这一点如果是在kotlin里面调用是没有问题的,但在java里面调用就需要带上注解@JvmOverloads
//同样这里需要注意的就是默认参数最好要放在后面不然就达不到一般的效果
@JvmOverloads
fun a(x:Int,y:Int = 100){
return x + y
}
fun main(){
print(a(33))
//最后输出133
}
2
3
4
5
6
7
8
9
# 2.命名参数
显示的指定参数的值,可以配合默认参数使用
//默认参数当然还是可以写在前面的,但调用的方式不同
//这就是命名参数
@JvmOverloads
fun a(x:Int = 100,y:Int){
return x + y
}
fun main(){
print(a(y = 33))
//同样输出133
//这里的y一定要和函数里面的函数相匹配
}
2
3
4
5
6
7
8
9
10
11
# 3.可变数量的参数
需要添加vararg函数进行修饰
fun myList(vararg items:Int):List<Int>{
val myItems = ArrayList<Int>()
for (item in items){
myItems.add(item)
}
return myItems
}
//在主函数中只需要这样调用
val list = myList(2,5,6)
//注意一下如果参数列表还包含其他参数,则需要用命名参数进行调用
//例如
fun myList(vararg items:Int,name:String):List<Int>{
....
}
//则调用时需要以以下方式进行调用
val list = myList(4,5,name = "uii")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 三、函数的类型
返回Unit的函数
即返回值为空,这个和c语言中的void类似
fun a():Unit{ //函数体 }
1
2
3返回Nothing的函数
即什么都不返回,一般这个函数执行后下面的代码都不再执行
fun b():Nothing{ }
1
2
3单表达式函数
当函数的函数体只有一行代码时,可以省略花括号,直接采用等号连接代码,这个特性可以结合when,if等语句使用,有时候会产生更加简洁的代码
fun c(n:Int):Int = n*3
1成员函数
这个没啥特别的和java里面的成员函数一致,即在类中的函数
局部函数
即函数里面嵌套一个函数,可以使用外层函数的变量
fun d(){ val a = 6 fun e(){ println(a*4) } }
1
2
3
4
5
6尾递归函数
即函数的尾部也是一个函数的调用,可以用tailrec 优化递归调用过程,虽然下面举得这个例子没什么实际作用,体会一下即可
tailrec fun b(n:Int):Int = if (n <= 1) 1 else b(n-1)
1Top level 函数
顶层函数,这个有点类似java里面的静态成员函数,同一个包下的全部文件都可以直接调用这个函数
//直接在一个kt文件下编写 fun f(){ println("hello world") }
1
2
3
4无参的main函数
//这个最简单了,前面也有涉及 //虽然主函数也可以有参数,但一般情况下用不到 fun main(){ }
1
2
3
4
5
# 四、优化代码的过程
# 1.原始代码
这个是最开始的代码,这段代码和其他语言几乎没有区别
fun fibSeries(n:Int):Int{
if(n <= 2){
return 1
}else{
return fibSeries(n-1) + fibSeries(n-2)
}
}
2
3
4
5
6
7
# 2.利用kotlin if语句的返回值优化
这一步应该是kotlin的特色,if语句以最后一行的值作为返回值
fun fibSeries(n:Int):Int{
return if(n <= 2){
1
}else{
fibSeries(n-1) + fibSeries(n-2)
}
}
2
3
4
5
6
7
# 3.if语句默认执行第一行语句
这个应该是许多编程语言所公认的
fun fibSeries(n:Int):Int{
return if(n <= 2) 1 else fibSeries(n-1) + fibSeries(n-2)
}
2
3
# 4.kotlin独特的函数语法糖
如果函数只有一行代码那么可以直接用等号进行连接
fun fibSeries(n:Int):Int = if(n <= 2) 1 else fibSeries(n-1) + fibSeries(n-2)
是不是爱上Kotlin了,简洁的代码格式使得开发过程更加高效,同时代码极具观赏性