前言
我们在开发中把复杂的逻辑拆分成多个功能函数,增加代码的可读性和可维护性。
函数声明
用关键字fun声明一个函数
fun sum(left:Int,right:Int):Int {
return left+right
}
函数参数默认值
kotlin中函数允许有默认值,可以减少方法的重载(方法名相同,方法的参数类型和个数不同)
fun sum(left:Int,center:Int,right:Int = 0):Int {
return left+center+right
}
// 我们可以选择性的对有默认值的函数传或者不传这个参数
fun main(){
sum(0,10)
sum(0,10,15)
}
可以减少Java语言中的方法重载
具名函数
调用一个众多参数的函数时,参数类型和参数名匹配比较麻烦,具名参数不用考虑参数在函数中的顺序a
fun main(){
a(right = flase, center = "center", left = 0,isEmpty = false)
}
fun a(left :Int,center :String,right:Boolean isEmpty:Boolean)
函数拥有4个参数,可以解决复杂的函数很多参数赋值问题
函数默认返回值Unit
"无返回值"的函数,它返回值类型是Unit。通常我们会省略它
fun a(p1:Int):Unit{return Unit}
// 省略Unit
fun a(p1:Int){return}
可以直接return 或者 加上Unit
单函数表达式
if或者when分支块仅有一行时,可以省略花括号。当函数返回单个表达式,可以省略花括号并且在=符号后指定代码
fun sum(left:Int,right:Int):Int = left+right
// kotlin编译器可以推断出函数的返回值类型,可省略函数的返回值类型
fun sum(left:Int,right:Int) = left+right
// 函数=表达式
fun isEmpty(str:String) = if(str.length == 0) true else false
fun findNum(num:Int) = when(num){
1->0
2->1
else -> -1
}
可变数量的参数
java中用propertyType... propertyName声明一个可变数量的参数:
private void s(Integer... a){...}
kotlin中使用关键字vararg声明可变数量的参数,一个方法只能有一个参数用vararg修饰。
fun main(){
sum(1,2,3)
}
fun sum(vararg a:Int){
for(i in a){
println(i)
}
}
如果vararg参数不是最后一个参数,其后的参数可用具名参数的方式传递:
fun main(){
sum(1,2,3,b=10,c=100)
}
private fun sum(vararg value:Int,b:Int,c:Int){...}
通过数组给vararg类型参数传参,使用伸展(spread)操作符(在数组前面加*):
fun main(){
val a = intArrayOf(1,3,4)
sum(*a,b=3,c=4)
}
fun sum(vararg a:Int,b:Int,c:Int){...}
中缀表示法
使用infix关键字修饰的函数可以使用中缀表示法,忽略函数调用的点和括号。必须满足的条件:
- 用
infix修饰的函数只有一个参数 - 必须是成员函数或扩展函数
- 不能是
vararg声明的可变数量的参数 Kotlin中提供的Tuples.kt中数据类型Pair
public data class Pair<out A, out B>(
public val first: A,
public val second: B
) : Serializable {...}
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
数据类型Pair有infix修饰的扩展函数to->A.to(that:B)
fun test() {
val pair = 20 to "age"
println("pair=$pair") // pair=(20, age)
}
使用A to B的方式创建了Pair对象,省略了调用函数的点和括号。
// 用`infix`
infix fun <T> Collection<T>.has(item:T) = item in this
fun test() {
val arr = arrayListOf("kotlin","ios","android")
if (arr has "android"){
println("has android")
}else{
println("no android")
}
}
函数作用域
Kotlin中函数可以在文件顶层声明,默认情况下可以在当前文件所有的项目中任意地方访问,除非在函数显示的加上private访问修饰符。
// 当前项目中可以调用
fun sum(left:Int,right:Int): Int{...}
// 当前文件中可以调用
private fun a(){}
成员函数
类内部或对象内部创建的函数我们称成员函数:
class A{
fun b(){}
}
fun main(){
A().b()
}
局部函数(Kotlin中支持一个函数嵌套另一个函数)
局部函数:函数内部声明一个函数。
fun main(){
val a=1
fun b(){
println(a)
}
}
局部函数可以访问外部函数声明的属性。
泛型函数
用关键字fun之后根<T>声明一个泛型函数
fun <T> a(b:T){
println(b)
}
可以声明的泛型类型作为函数的返回值
fun <T> a(b:T):T{
return b
}
总结
Kotlin函数和Java中的方法不论写法还是使用都是有很大区分的。kotlin更加简单化,更人性化。