Kotlin函数的运用总结

一、泛型函数:
个人理解为:此函数传参只能传入被本人指定的类型

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++;
        }
    }

你可能感兴趣的:(知识总结)