函数定义
fun main(vararg args:Array<String>):Unit{
}
补充:vararg 变长参数 相当于java String… args
�
函数 Funciton 与 方法 Method
- 方法是函数一种特殊类型
- 从形式上,有 receiver 的函数即是方法。(比如 对象里面的 getXXX)
fun function() {
//顶级函数,不在任何 class 内
}
class Method {
fun getName() {
//必须通过对象.getName调用方法
}
}
函数类型
fun call() {
var f:()->Unit = ::function
var f2:(String)->Unit= ::function2
val kFunction1:(Method)->Unit = Method::getName
}
fun function() {
//顶级函数,不在任何 class 内"
}
fun function2(str: String) {
//顶级函数,不在任何 class 内"
}
class Method {
fun getName() {
//必须通过对象.getName调用方法
}
}
函数的类型 = (参数类型1,参数类型2,…) -> 返回参数类型
如果是包含receiver ,如上述代码kFunction1 函数的类型= (Receiver,参数类型…) -> 返回参数类型
函数的引用
fun call() {
var f = ::function
var f2 = ::function2
val kFunction1 = Method::getName
}
fun function() {
//顶级函数,不在任何 class 内"
}
fun function2(str: String) {
//顶级函数,不在任何 class 内"
}
class Method {
fun getName() {
//必须通过对象.getName调用方法
}
}
把函数作为参数传递
fun call() {
val fooGetName: (Foo, String) -> Unit = Foo::getValue
val fooGetName2: Foo.(String) -> Unit = Foo::getValue
doWithFoo(fooGetName)
}
fun doWithFoo(fooGetName: (Foo, String) -> Unit) {
fooGetName.invoke(Foo(), "hello")
}
注:fooGetName2 类型另外一种写法
vararg 变长参数
fun multiParameter(vararg array: Int) {
for (i in array) {
println(i)
}
}
这里的参数 array 类型实际是 IntArray
multiParameter(1, 5, 6, 77)
补充知识点:listOf 和 arrayOf 都使用了 vararg 实现
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
public inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T>
返回多个参数
fun returnMoreParameter():Triple<String,Double,Boolean>{
return Triple("july",100.0,true)
}
注:返回两个参数使用 Pair
val(x,y,z)= returnMoreParameter();
println("$x $y $z") //july 100.0 true
解构 x,y,z 分别对应三个返回参数
默认参数
fun defaultParameter(x: String="", y: Int, z: Boolean=true) {
}
defaultParameter( "abc",1)
这里调用时 z 没有传值,且z 默认赋值为true ,那 x 能不传吗?
不行,编译器无法判断当前要赋值到那个参数
:::danger
注:最后一个参数才能省略(且参数有默认值)
:::
具名参数
defaultParameter( "abc",1)
defaultParameter( y=1,x="abc")//具名参数
fun defaultParameter(x: String="", y: Int, z: Boolean=false) {
}
具名参数可以不按照函数参数顺序传值