IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin学习:4.3.高阶函数 -> 正文阅读

[移动开发]Kotlin学习:4.3.高阶函数

高阶函数

如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,
那么该函数就称为高阶函数(Kotlin Higher-Order Functions)

格式:

fun 高阶函数名(参数函数名:参数函数类型):高阶函数返回类型{
	//高阶函数体
}

理解

Kotlin 里「函数可以作为参数」这件事的本质,是函数在 Kotlin 里可以作为对象存在——因为只有对象才能被作为参数传递啊。
赋值也是一样道理,只有对象才能被赋值给变量啊。
但 Kotlin 的函数本身的性质又决定了它没办法被当做一个对象。
那怎么办呢?
Kotlin 的选择是,那就创建一个和函数具有相同功能的对象。
怎么创建?使用双冒号。

::函数名称

在 Kotlin 里,一个函数名的左边加上双冒号,它就不表示这个函数本身了,而表示一个对象,或者说一个指向对象的引用,但,这个对象可不是函数本身,而是一个和这个函数具有相同功能的对象。

转:https://rengwuxian.com/kotlin-lambda/

所以总结高阶函数:

高阶函数是由函数 和 函数类型的对象组成。它和其他函数没有区别。

举例说明什么是高阶函数

如下作为参数时:

fun a(funParam: (Int) -> String): String {
  funParam(1)
}

如下作为返回值时:

fun c(param: Int): (Int) -> Unit {
  ...
}

语法

定义函数类型的参数语法

(参数类型) -> 返回值类型

调用语法

高阶函数名( 参数函数名 :(参数类型) -> 返回值类型 ){

}

调用时:

::method 

又例,怎么使用高阶函数

//方法
    fun a(param: (String) -> Unit) {
        println("调用方法a")
        param("??")
    }

    fun b(str: String) {
        println("输出==$str")
    }

//调用
        a(::b)

//输出
2022-03-03 20:44:32.595 3291-3291/com.example.kotlintest3 I/System.out: 调用方法a
2022-03-03 20:44:32.595 3291-3291/com.example.kotlintest3 I/System.out: 输出==??

匿名函数

匿名函数格式:

fun(参数:参数类型):返回值类型{ //内容 }

调用格式:

高阶函数名( fun(参数:参数类型):返回值类型{ //内容 } ){

}

匿名函数就是把如上代码中 b 函数的函数名称给舍弃,组合成:

//方法
    fun a(param: (String) -> Unit) {
        println("调用方法a")
        param("??")
    }
//调用
        a(fun(str: String) {
            println("匿名函数输出==$str")
        })

//输出
2022-03-03 21:31:15.929 6991-6991/com.example.kotlintest3 I/System.out: 调用方法a
2022-03-03 21:31:15.929 6991-6991/com.example.kotlintest3 I/System.out: 匿名函数输出==??

这就是匿名函数,匿名函数也是函数类型的对象

Lambda表达式

lambda表达式格式:

  1. lambda 表达式总是被大括号括着;
  2. 其参数(如果有的话)在 -> 之前声明(参数类型可以省略);
  3. 函数体(如果存在的话)在 -> 后面
{ 参数:参数类型,参数 参数类型 -> run { //方法体 } }

调用格式:

高阶函数名({ 参数:参数类型,参数 参数类型 -> run { //方法体 } })

lamda也是函数类型的对象,这跟Java不一样

例1,完整格式的使用:

//定义方法

    fun c(param: (String,Int) -> Unit, str: String) {
        println("调用方法c")
        param("??",2)
    }

//调用
        c({ str: String,i :Int ->
            run {
                println("调用lambda str=$str")
                println("调用lambda i=$i")
            }
        }, "")

//输出
2022-03-03 21:29:08.484 6929-6929/com.example.kotlintest3 I/System.out: 调用方法c
2022-03-03 21:29:08.484 6929-6929/com.example.kotlintest3 I/System.out: 调用lambda str=??
2022-03-03 21:29:08.484 6929-6929/com.example.kotlintest3 I/System.out: 调用lambda i=2

例2,如果只有一个参数

//方法
    fun a(param: (String) -> Unit) {
        println("调用方法a")
        param("??")
    }

//调用 ,如下调用方法都支持

        a({ str: String ->
            println("输出==$str")
        })

        a (){ str: String ->
            println("输出==$str")
        }
 
        a { str: String ->
            println("输出==$str")
        }

        a {
            println("输出==$it")
        }

it:单个参数的隐式名称

如上栗子:

        a {
            println("输出==$it")
        }

如果高阶函数的函数类型参数只有一个参数,并且我们使用lambda表达式的写法,那么就可以省略这个参数,如果要使用这个参数 就直接使用 it

标准高阶函数

forEach

map

flatMap

reduce

filter

takeWhile

Kotlin 里匿名函数和 Lambda 表达式的本质

本质都是对象,而非函数

参考地址

转:https://rengwuxian.com/kotlin-lambda/

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:12:56  更:2022-03-06 13:15:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:57:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码