Kotlin函数的运用总结

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

fun <Int> 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<Int>(1, 5, 8);

二、内联函数:
个人理解为:比如此函数的输入内容为Number,此时我们只能传入Number类型的数据,而不能传入Number的子类,如:Int、Float、Double,而使用内联函数就可以传入它的子类

inline  fun<reified T:Number> 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 <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
    }
调用处:
fun test(){
        var string_array:Array<String> = 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>(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 <T>Array<T>.swap(one : Int,two :Int){
        val tmp=this[one]
        this[one] =this[two]
        this[two]=tmp
    }

调用处为:
		 val array : Array<Double> = 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 <T> Array<T>.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<String> = 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++;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值