• Kotlin 初阶/高阶函数


    匿名函数

    使用匿名函数扩展某些内置函数的功能

    这里扩展了 count 的功能,现在表示获取字符串中字符 e 出现的次数

    fun anonymous(){
        val total:Number = "hello".count { letter ->
            letter == 'e'
        }
        println(total)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    带返回值匿名函数

    类似于 js 的箭头函数

    箭头指向的为匿名函数返回值类型;

    括号里面可以写任意长语句,但是最后一行就作为返回值,且 不可以用 return!!!

    val getName:()->String={
        val str:String = "str"
        "hello$str"
    }
    
    • 1
    • 2
    • 3
    • 4

    带参的匿名函数

    同上,只不过你需要在小括号里面声明后续使用参数的类型(注意仅需要声明类型即可!!!)

    (Int) 声明参数类型
    -> Int 匿名函数返回值类型
    num -> 参数名称为 num,我们可以使用它
    12 + num 返回值

    val getAge: (Int) -> Int = { num ->
            12 + num
        }
    
    • 1
    • 2
    • 3

    it 关键字

    当且仅当只有一个参数时,在函数体里面直接使用 it 指代该参数

    因为 it 可以直接指代参数,所以不需要在写诸如 it-> 这玩意了

    val getName: (String) -> Unit = {
            println(it)
        }
    
    • 1
    • 2
    • 3

    类型推断

    你可以省去匿名函数前面的语法糖,但是参数名与参数类型绝对要存在;

    该方法可以让 kotlin 自动推断返回值类型

    val getStr = { name: String, age: Int ->
        "name: $age"
    }
    println(getStr("tom", 12))
    
    • 1
    • 2
    • 3
    • 4

    lambda

    定义一个参数是函数的函数

    fun main() {
        // 定义一个匿名函数
        val getAge = { nums: Int -> nums }
        // 调用参数是函数的函数
        println(useFunc("tom", getAge))
    }
    
    // 第二个参数是一个函数,可以把它看做是一个函数签名
    fun useFunc(name: String, func: (Int) -> Int): String {
        return "$name + ${func(12)}"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当然我们还有一个简略写法;

    当一个参数是函数的函数中,有且仅有一个函数参数且是最后一个参数时,调用时直接在大括号内写函数体;

    fun main() {
        // 这里的大括号就对应最后一个参数func的函数体,他是一个匿名函数!!!
        useFunc("tom") { nums: Int ->
            nums
        }
    }
    
    fun useFunc(name: String, func: (Int) -> Int) {
        println("$name + ${func(12)}")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    函数引用

    脱裤子放屁;

    使用双冒号后跟着函数名,就可以引用该函数了,避免了直接写函数占用太多空间

    fun main() {
        // 双冒号引用函数,注意该函数不能是匿名函数!!!
        // 类似val xxx = {} 这玩意不能引用!
        f2("tom", ::f1)
    }
    
    // 被引用的函数
    fun f1(s: String, i: Int): Unit {
        println("$s + $i")
    }
    
    private fun f2(name: String, func: (String, Int) -> Unit) {
        func(name, 12)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    返回值为函数类型的函数

    大无语了套娃函数;

    代码解释

    1. f1 接收一个参数,并且返回一返回值为 string 类型的匿名函数
    2. getStr 获取了函数签名,故 f1 没有被基于参数!
    3. getStr(“i”)表示赋予 f1 参数值 i
    4. getStr(“i”)(“it”) 因为执行完第三步后就会返回一个匿名函数,此时我们就需要再对该匿名函数传入一个参数,才能正确运行
    fun main() {
        val getStr = ::f1
        println(getStr("i")("it"))
    }
    
    private fun f1(name: String): (String) -> String {
        return { str ->
            "$name like $str"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

  • 相关阅读:
    kubernetes RBAC
    关于new Set( )还有哪些是你不知道的
    HyperLynx(五)反射仿真
    LeetCode 热题 HOT 100 第八十一天 647. 回文子串 用python3求解
    vue2和vue3的区别
    【LeetCode刷题】新手一看就会的——动态规划详解—入门
    蓝桥杯实战应用【算法代码篇】-次数差(附Java、Python和C++代码)
    【numpy简介、入门、数组创建】
    springboot+视频网站 毕业设计-附源码240925
    字节跳动测试岗,3面都过了,HR告诉我这个原因被刷了...
  • 原文地址:https://blog.csdn.net/delete_you/article/details/127092589