一、泛型函数:
个人理解为:此函数传参只能传入被本人指定的类型
fun dis(one : kotlin.Int ,two : kotlin.Int,vararg name: kotlin.Int): kotlin.Int {
var str : kotlin.Int =25
for (item in name){
str=one+two
}
return str
}
调用处:val dis = dis(1, 5, 8);
二、内联函数:
个人理解为:比如此函数的输入内容为Number,此时我们只能传入Number类型的数据,而不能传入Number的子类,如:Int、Float、Double,而使用内联函数就可以传入它的子类
inline fun set(num:T){
tv1.text="$num"
}
调用处: set(1)或set(1.0)或set(2.12345678)
三、简化函数:
因为在Kotlin里函数也相当于一个变量,所以我们也可以直接赋值,此函数的意思是如果一个 函数的表达式比较简单,那么我们可以自己赋值,比如一两行的代码就可以搞定,那么我们可以用等号来代替大括号。
fun test(n : Int):Int=if (n<=1)n else n*test(n-1)
调用:val ttest = test(5)
四、高阶函数:
因为Kotlin的函数是一种特殊的变量,比如我们有两个函数,函数A,函数B,此时我们可以把A函数当做B函数的输入参数,像普通变量一样参与B函数的表达计算,此时B函数嵌套了A函数,故而B函数被称作为高阶函数。
fun maxCustom (array: Array, greater : (T, T) -> Boolean): T? {
var max: T?=null
for (item in array){
if(max == null || greater(item,max)){
max = item
}
}
return max
}
调用处:
fun test(){
var string_array:Array = arrayOf("How","do","you","do","I'm ","Fine")
var count :Int =0
btn2.setOnClickListener {
tv3.text= when (count%4){
0 -> longToast("字符串数组的默认最大值为${string_array.max()}").toString()
1 -> longToast("字符串数组按长度比较的最大值为${maxCustom(string_array,{a,b -> a.length >b.length})}").toString()
2 -> longToast("字符串数组的默认最大值为(使用高阶函数)为${maxCustom(string_array,{a,b-> a>b})}").toString()
else ->longToast("字符串数组按去掉空格再比较长度最大值为${maxCustom(string_array,{a,b ->a.trim().length>b.trim().length})}").toString()
}
count++;
}
}
上面函数的第二个变量就是一个函数变量,其中变量的名字为greater,冒号后面的“ (T,T)”,表示greater函数有两个类型为T的输入参数,该函数返回值是Boolean。
在调用maxCustom函数时,第二个参数被大括号包了起来,这是Lambda表达式的匿名函数写法,中间的“->”把匿名函数分为两部分,前半部分表示函数的输入参数,后半部分表示函数体。“{a,b->a.length>b.length}”按照规范写法是:
fun anonymous(a:String,b:String):Boolean{
var result:Boolean=a.length>b.length
return result
}
结果:
调用max的比较结果是“you”,字符串长度的比较结果为“I’m ”,用大于号比较字符串的结果,此时的最大值也为“you”,可见该方法的结果跟max方法一样,抹掉空格后,比较结果为“Fine”
五、扩展函数:
个人理解为:在我们写项目的时候,比如一个StringUtil、DateUtil工具类等,我们要不断的写工具类,工具类多了我们就越来越难管理了,所以扩展函数就允许开发者给系统类补写新的方法,而无需另外编写额外的工具类。
fun Array.swap(one : Int,two :Int){
val tmp=this[one]
this[one] =this[two]
this[two]=tmp
}
调用处为:
val array : Array = arrayOf(1.0,2.0,3.0,4.0,5.0)
btn.setOnClickListener {
array.swap(0,3)
}
上面就是给Array扩展了一个方法,我们可以直接调用这个方法,达到第一个元素和第四个元素进行交换。
六、尾递归函数:
个人理解为:它指的是函数末尾返回值调用了自身函数,此时要在fun前面加上关键字tailrec,告诉编译器这是一个尾递归函数。下面是一个求余弦不动点的尾递归函数:
tailrec fun findFixPoint(x :Double=1.0):Double=if (x==Math.cos(x)) x else findFixPoint(Math.cos(x))
调用处:tv2.text="${findFixPoint(10.0)}"
七、扩展高阶函数
扩展和高阶函数的组合使用
fun Array.maxCustom (greater : (T, T) -> Boolean): T? {
var max: T?=null
for (item in this){
if(max == null || greater(item,max)) max = item
}
return max
}
fun test(){
var string_array:Array = arrayOf("How","do","you","do","I'm ","Fine")
var count :Int =0
btn.setOnClickListener {
tv3.text= when (count%4){
0 -> "字符串数组的默认最大值为${string_array.max()}"
1 -> "字符串数组按长度比较的最大值为${string_array.maxCustom({a,b-> a.length>b.length})}"
2 -> "字符串数组的默认最大值为(使用高阶函数)为${string_array.maxCustom({a,b-> a > b})}"
else -> "字符串数组按去掉空格再比较长度最大值为${string_array.maxCustom({a,b -> a.trim().length > b.trim().length})}"
}
count++;
}
}