函数的一般形式
1 2 3 4 5
| fun mathodName() : String {
}
|
与C、C++或java的不同
- 如果要重载,在fun前面加
override
- 如果想让子类重载,要加
open
关键词(类也一样)
- 可以定义全局函数,函数不是必须写在类里
- 可以有默认参数,且默认参数不必放在最后几个
1 2 3 4 5 6 7 8 9 10 11 12
| fun TextView.println(str:CharSequence) { append("\n${str}") } fun TextView.print(str:CharSequence) { append(str) } fun func(str:String = "哈哈哈",i:Int, j:Double) { val text:TextView = findViewById(R.id.text) text.print("$str") text.println("$i") text.println("$j") }
|
- 此时,在调用时,如果第一个不采用默认参数,则按照顺序传递三个参数,否则按照以下形式传递参数
- 可变参数,在参数列表中,参数名称前用vararg(var = varable, arg = 参数)修饰
1 2 3 4 5 6 7
| fun appendString(tag:String, vararg info:String?) : String { var str:String = "${tag}" for (item in info) { str = "${str}\n${item}" } return str }
|
Kotlin的特殊函数
泛型函数/内联函数
例子
1 2 3 4 5 6 7
| fun<T> appendString(tag:String, vararg info:T?) : String { var str:String = "${tag}" for (item in info) { str = "${str}\n${item.toString()}" } return str }
|
调用方法
1 2 3
| btn.setOnClickListener { text.text = appendString<Int>("转化", 1,2,3,4,5,6,7,8,9) }
|
注意
- 只有泛型类才拥有成员泛型函数,或者可以把泛型函数作为全局函数
- Kotlin是强类型的语言,如果需要即传递Number类继承的类对象,而不继承其他类对象,不能写
<Number>
要写成<reified T : Number>
,这个写法等价于java的<T extends Number>
简化函数
Kotlin中,函数的定义形式和变量十分相似,这是因为函数也是一种特殊变量,可以对他赋值
例子
1
| fun factorial(n:Int):Int = if(n <= 1) n else n*factorial(n-1)
|
尾递归函数
在fun
之前加上关键字tailrec
(tail——尾巴,rec——不知道),告诉编译器这是一个尾递归函数,编译器可以自动优化成循环
例子
1 2
| tailrec fun findFixPoint(x:Double = 1.0) : Double = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))
|
高阶函数
传入的参数是一个函数,个人认为相当于C/C++的函数指针,或者说传递了一个函数变量
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fun<T> maxCustom(array:Array<T>, greater:(T,T) -> Boolean) : T? {
var max:T? = null for (item in array) { if (max == null || greater(item, max)) { max = item } } return max }
|
调用
1 2 3 4
| val arr:Array<Int> = arrayOf(1,2,3) btn.setOnClickListener { text.text = "最大值为${maxCustom<Int>(arr, {a,b -> a > b}).toString()}" }
|
系统增强函数
扩展函数
可以给已有的类中添加函数,作为成员函数
例子
1 2 3 4 5 6
| fun TextView.println(str:CharSequence) { append("${str}\n") } fun TextView.print(str:CharSequence) { append(str) }
|
调用
和正常成员函数一样调用
1 2 3 4 5 6
| val text:TextView = findViewById(R.id.text) val btn:Button = findViewById(R.id.btn) btn.setOnClickListener { text.println("123") text.print("demo") }
|
单例对象
用object替换class,这样其中的所有函数都是静态成员函数了
相当于static修饰符