【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )(一)

简介: 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )(一)

I . 函数类型


函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中的参数 , 返回 返回值类型 的返回值 ;



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



① 参数列表 : 参数类型的列表 , 多个参数类型使用逗号隔开 ;


② -> 符号 : 由参数列表指向返回值类型 , 该符号用于分割参数类型列表 与 返回值类型 ;


③ 返回值类型 : 只有一个返回值类型 ;


④ 示例 : (Int, Int)->Int 参数类型 , 表示该参数传入两个 Int 类型的参数 , 返回 Int 类型返回值 ;






II . 带参数名的参数列表


1 . 函数类型参数名称 : 参数列表中可以只是参数类型 , 也可以加上参数的变量名称 , 参数名称可以用于说明参数的含义 , 增加函数类型的理解性 ;



2 . 只有参数类型的函数类型 : 参数列表中只有参数类型 ;


( 参数类型1 , 参数类型2 , … 参数类型n ) -> 返回值类型



3 . 有参数名称的函数类型 : 参数列表中每个元素都由 参数名称 : 参数类型 组成 , 多个列表元素使用逗号隔开 ;


( 参数名称1 : 参数类型1 , 参数名称2 : 参数类型2 , … 参数名称n : 参数类型n ) -> 返回值类型



4 . 带参数名称的函数类型示例 :



① 没有参数名的函数类型 : (Int , String)->String ;


② 有参数名的函数类型 : (age : Int , name : String)->String ;






III . 可空函数类型


1 . 函数类型根据是否可空分类 : 函数类型 与 普通变量类型一样 , 也分为可空类型 , 非空类型 两类 ;



2 . 默认非空类型 : 默认的函数类型都是非空类型 , 即函数定义时 , 需要对其进行初始化 , 或延迟初始化 ;



3 . 可空类型函数表示方法 : 可空的函数类型声明时 , 需要在函数类型外部加上括号 , 并在右侧添加 ? 可空符号 ;


( ( 参数列表 ) -> 返回值类型 ) ?



4 . 可空函数类型 与 非空函数类型 示例 :



① 非空函数类型 : (Int , String)->String , 普通的函数类型 , 默认就是非空的函数类型 ;


② 可空函数类型 : ( (Int , String)->String ) ? , 在非空函数类型基础上 , 外层添加括号 , 右侧添加 ? , 该函数类型就变成了可空函数类型 ;






IV . 复杂函数类型解读


1 . 复杂函数类型 :



① 参数返回值是普通类型 : 如果函数的参数类型和返回值类型都是普通的类型还好 , 解读起来不是很困难 ;


② 参数返回值是函数类型 : 如果函数类型的参数类型或返回值类型中有函数类型 , 即嵌套的函数类型 , 这些函数类型很复杂 ;




2 . 右箭头 -> 符号的结合性 : 该符号是右结合的 , 解读时 , 先将第一个 -> 符号右边的值理解成返回值 , 再逐步解析 :



( Int , String ) -> ( Float , Double ) -> String



① 分析外层函数类型 ( 函数类型 ) : 首先根据右结合性 , 从左到右开始解读 , 读取到第一个 -> 符号 , 说明这是一个函数类型 , ( Int , String ) 是参数列表 , ( Float , Double ) -> String 是返回值类型 ;



② 分析内层函数类型 ( 外层函数的返回值类型 ) : 然后继续分析 ( Float , Double ) -> String 类型 , 外层的函数类型的 返回值类型 是一个 函数类型 , 该函数类型参数列表是 ( Float , Double ) , 返回值是 String 类型 ;



③ 总结 : 这是函数类型的嵌套 , 外层函数类型的参数类型是 ( Int , String ) , 函数的返回值类型是 ( Float , Double ) -> String 是一个函数类型 ;




3 . 最佳实践 : 复杂的函数类型可读性很差 , 建议使用圆括号注明函数类型的结合性 , 层次 ;


( Int , String ) -> ( Float , Double ) -> String


这样表示虽然没有错误 , 也能读懂 , 但是该表示并不是一目了然 , 读懂理解也要花点时间 , 完全没有必要在代码中出脑筋急转弯题目 , 推荐加上圆括号 , 写成以下形式 :


( Int , String ) -> ( ( Float , Double ) -> String )


这样就可以一目了然 , ( Int , String ) 是参数列表 , ( ( Float , Double ) -> String ) 是返回值类型 , 该返回值类型是一个函数类型 ;



不推荐这种反人类的类型定义 , 建议还是以简洁为主 , 参考 C 语言的函数类型嵌套 int (*p) (int*, int (*f)(int*)) , C 语言的函数 + 指针类型嵌套 int (*(*p2)[5])(int*) , 这个需要根据复杂指针解读技巧慢慢解读 , 要花费很长时间才能搞懂 ;






V . 函数类型别名


使用 typealias 为函数类型声明一个别名 : 使用函数类型别名 , 能有效降低代码的复杂度 , 提高可读性 , 函数类型别名声明格式如下 :



typealias 别名 = 函数类型




代码示例 : 下面的示例中 , 为 (Int, Int) -> Int 函数类型声明了一个别名 , 该别名与函数类型的作用是一样的 ;

// 1 . 声明函数类型
typealias mathAdd = (Int, Int) -> Int
// 2 . 为函数类型数理化
var add : mathAdd = {a : Int, b : Int -> a + b}
// 3 . 为函数类型实例化
var add2 : (Int, Int) -> Int = {a : Int, b : Int -> a + b}
fun main() {
    // 4 . 调用函数
    var result = add(1,2)
    println("$result")
    // 5 . 调用函数
    var result2 = add2(1,2)
    println("$result2")
}



目录
相关文章
|
9天前
|
安全 Kotlin
Kotlin - 作用域函数
Kotlin - 作用域函数
|
6天前
|
Java Kotlin
Kotlin - 方法重载与默认参数
Kotlin - 方法重载与默认参数
Kotlin - 方法重载与默认参数
|
12天前
|
Kotlin
Kotlin - 高阶函数与函数引用
Kotlin - 高阶函数与函数引用
25 3
Kotlin - 高阶函数与函数引用
|
7天前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
|
7天前
|
Kotlin
Kotlin - 参数与异常
Kotlin - 参数与异常
|
10天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
|
13天前
|
Kotlin
Kotlin - 参数与异常
Kotlin - 参数与异常
|
10天前
|
安全 Kotlin
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
|
11天前
|
安全 IDE Java
Kotlin教程笔记(3) - 空类型和智能类型转换
Kotlin教程笔记(3) - 空类型和智能类型转换
|
12天前
|
安全 Kotlin
Kotlin - 作用域函数
Kotlin - 作用域函数
25 3