一、基本用法
Kt函数必须使用fun关键字开头,后面紧跟函数名,以及一对小括号,小括号是函数参数列表,如果函数有返回值,在小括号后面加冒号,冒号后面是函数返回值类型。
/**
* 函数的标准定义
*/
fun double(x : Int) : Int{
return 2 * x
}
在Kt中调用函数,函数名后面是小括号,小括号中是要传递的函数参数值
var result = double(2)
如果是调用成员函数,需要使用点(.)
Sample().foo() 首先会实例化Sample,然后调用foo函数
二、使用中缀标记法调用函数
使用中缀标记法调用函数
- 中缀标记法:就是将函数名称放在两个操作数中间,左侧是包含函数的对象或者值,右侧是函数的参数值
- 中缀标记法函数满足条件
1、成员函数或者拓展函数
2、只有1个参数
3、使用infix关键字声明函数
infix fun String.div(str : String) : String{
return this.replace(str,"") //将当前字符串中的所有Str替换为“”
}
var str = "hello world"
//一般方法调用div函数
println(str.div("l"))
//使用中缀标记法
println(str div "l")
//中缀标记法连续使用
println(str div "l" div "o")
三、单表达式函数
- 单表达式函数
如果一个函数的函数体只有一句语句,而且是return语句,可以省略函数体的打括号和return关键字。return后面的表达式可以直接写在函数声明的后面,用等号与函数声明分割。
fun triple(x : Int) : Int = x * 3
Kt编译器可以推断出等号右侧的表达式的类型,那么可以省略函数的返回值类型。
fun triple(x : Int) = x * 3
四、函数参数和返回值
4.1、可变参数
一个函数的一个参数(一般是最后一个参数)可以标记为 vararg,这样会将该参数作为可 变参数处理。所谓可变参数,就是指可以任意多个参数,在函数内部,会按数组来处理这些参 数值。
/**
* asList 函数是一个泛型函数,该函数只有一个参数,井且是可变参数
* 该函数返 回 List<T>类型。
* asList函数的功能是将一组值转换为 List<T>对象,并返回该对象。
*/
fun <T> asList(vararg ts : T) : List<T>{
val result = ArrayList<T>()
for (t in ts){
result.add(t)
}
return result
}
调用:
//由于 ts 是可变参数,因此可以传递任意多个参数值,并且可以是任意类型的。
/**在 asList 函数内部,类型为 T 的 vararg参数会被看作一个 T类型的数组,也就是说, asList 函数中的 ts变量的类型为 Array<outT>。*/
var list = asList(1,2,"a",4,5)
println(list)
只有一个参数可以标记为 vararg。如果 V缸arg 参数不是函数的最后一个参数,那么对于 vararg参数之后的其他参数,可以使用命名参数语法来传递参数值,或者,如果参数类型是函 数,可以在括号之外传递一个 Lambda表达式。例如,下面的 asList 函数有 3 个参数,第 1 个 参数是可变参数,后两个是 valueI 和 value2 参数 。由于最后一个参数不是可变参数,因此在 传递 valueI 和 value2 参数的值时 需要使用命名参数
fun <T> asList (vararg ts : T,value1 : Int,value2 : String) : List<T>{
val result = ArrayList<T>()
for (t in ts)
result.add(t)
println("value1 = ${value1} value2 = ${value2}")
return result
}
调用:
//使用命名参数传递value1 和value2参数的值
var list = asList(1,2,3 ,value1 = 2,value2 = "abc")
println(list)
调用一个存在 vararg 参数的函数时,我们可以逐个传递参数值,如 asList(l, 2, 3),或者, 如果我们已经有了一个数组,希望将它的内容传递给函数 ,可以使用展开( spread)操作符(在 数组之前加一个*):
val a = arrayOf(1,2,3)
val list= asList(-1, 0, *a, 4)