【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

简介: 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

文章目录

I . Lambda 表达式 简介

II . Lambda 表达式语法

III . Lambda 表达式类型

IV . Lambda 表达式返回值

V . Lambda 表达式调用

VI . Lambda 表达式完整语法示例 ( 声明 | 实现 | 调用 )



I . Lambda 表达式 简介


Lambda 表达式 简介 :



① 作用 : Lambda 表达式可以作为函数参数 , 传递到函数中 , 使代码结构更加紧凑 ;


② 应用场景 : 集合中扩展集合操作 , 当做函数参数 , 替代匿名内部类 ;


③ 好处 : Lambda 表达式语法简洁 , 避免了冗长的函数声明调用过程 ;


④ 函数式编程 : 函数作为输入和输出 ; 在集合操作中 , 过滤 filter , 映射 map 等操作传入 Lambda 表达式 作为参数 , 很好地体现了函数式编程思想 ;




II . Lambda 表达式语法


Lambda 表达式 语法 :



{ a : Int, b : Int -> a + b}



① 示例说明 : 上面的代码示例是 Lambda 表达式的标准形式 , 其参数列表是 a : Int, b : Int , 在 -> 后面的函数体中, 可以直接调用 a 和 b 两个变量 ;


② 大括号 : Lambda 表达式需要完整的写在大括号中 , 其参数列表 , 执行代码 , 返回值 , 都写在一个大括号 {} 里 ;


③ 参数列表 : Lambda 表达式的参数列表 , 定义在 “->” 符号之前 , 格式为 “变量名 : 变量类型” , 多个参数使用逗号隔开 ;


④ 函数体 : Lambda 表达式的函数体可以由 1 11 行 , 也可以有多行 , 最后一行默认是 Lambda 表达式的返回值 ;


⑤ -> 符号 : 用于分割 参数列表 与 函数体 ;




III . Lambda 表达式类型


1 . Lambda 表达式 类型 : 分析下面示例中的 var add : (Int, Int)->Int 变量类型声明部分 ;



var add : (Int, Int)->Int = { a : Int, b : Int ->
    println("计算 : a + b = ${a + b}")
    a + b
}


① 变量或常量 : Lambda 表达式可以声明成变量 var , 也可以声明成常量 val ;


② 变量 / 常量 名称 : 符合标识符规则即可 ;


③ Lambda 表达式参数列表 : 在括号中 () 表示 , 如果没有参数 , 括号内空着即可 , 如果有多个参数使用逗号隔开 ;


④ -> 符号 : 在 Lambda 表达式类型中 , 用于分割 参数列表 和 返回值类型 ;


⑤ Lambda 表达式返回值 : 只允许有一个返回值 , 在 -> 符号之后 , 如果返回值为空 , 记作 Unit ;




2 . Lambda 表达式 类型声明 示例 :



① 无参数 空类型返回值 的 Lambda 表达式 类型 : ()->Unit , 无参数 () 内空着 , 返回值为空 , 记作 Unit ;


// 无参数 Unit 空类型返回值的 Lambda 表达式
var lambda1 : ()-> Unit = { println("lambda1") }


② 单个参数 Int 类型返回值 的 Lambda 表达式 类型 : (Int)->Int , 其参数是 Int 类型 , 返回值也是 Int 类型的 ;


// Int 类型参数 , Int 类型返回值 , 的 Lambda 表达式
var lambda2 : (Int)-> Int = { a : Int -> a + 1000}


③ 多个参数 Int 类型返回值 的 Lambda 表达式 类型 : (Int, Int)->Int , 其有两个 Int 类型参数 , 使用逗号隔开 ;


// 多个参数的 Lambda 表达式
var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->
    println("计算 : a + b = ${a + b}")
    a + b
}


④ 使用 Lambda 表达式作为参数 String 返回值类型 的 Lambda 表达式类型 : (Int, Int, (Int, Int)->Int)->Int , 该 Lambda 表达式类型有 3 33 个参数 , 分别是两个 Int 和 (Int, Int)->Int , 最后一个参数的类型是 Lambda 表达式类型 ;


// Lambda 表达式类型作为参数的 Lambda 表达式 , 第 3 个参数是 Lambda 表达式类型的参数
var lambda5 : (Int, Int, (Int, Int)->Int)->Int = { a : Int, b : Int, c : (Int, Int)->Int ->
    println("计算 : a + b = ${c.invoke(a, b)}")
    c.invoke(a, b)
}



这里关于 Unit 空类型说明一下 , 如果没有参数 , 括号中空着即可 , 如果返回值为空类型 , 必须写成 Unit 类型的返回值 , 相当于 Java 中的 void 空类型 ;




IV . Lambda 表达式返回值


1 . Lambda 表达式返回值 :



// 多个参数的 Lambda 表达式
var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->
    println("计算 : a + b = ${a + b}")
    a + b
}


① 返回值设置 : Lambda 表达式的返回值是 Lambda 表达式函数体的最后一行 ;


② 代码解析 : 如上述代码 , 其函数体部分有两行组成 , 第一行 println("计算 : a + b = ${a + b}") 打印计算公式 , 第二行才是真正的返回值 , 表示返回 a + b 的值 , 作为 Lambda 表达式的返回值 ;


③ 调用返回值 : 即使用 lambda4.invoke( 1 , 2 ) 或 lambda4 ( 1, 2 ) 调用 Lambda 表达式 , 返回 1 + 2 = 3 计算结果 , 最终都返回 3 ;



2 . 返回值类型错误 : 注意不要放错位置 , 如果最后一行的结果类型 , 与 Lambda 表达式的类型不一致 , 不是 Int 类型的返回值 , 会导致错误产生 ; 如下图示例 , 在最后一行写成字符串类型 , 编译时直接报错 ;

image.png





V . Lambda 表达式调用


1 . Lambda 表达式调用 : 使用 invoke 方法 , 或直接当做函数调用 , 即可调用 Lambda 表达式 ;



① 直接调用 : 调用格式为 “Lambda表达式变量 / 常量 ( 实际参数列表 )” ;


② invoke 调用 : 调用格式为 “Lambda表达式变量 / 常量.invoke( 实际参数列表 )” ;




2 . Lambda 表达式调用示例 :



① Lambda 表达式 代码示例 :


// 4 . 多个参数的 Lambda 表达式
var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->
    println("计算 : a + b = ${a + b}")
    a + b
}



② Lambda 表达式调用方法 : 使用 lambda4.invoke(1, 2) 和 lambda4(1, 2) 两种形式 , 都可以调用 Lambda 表达式 ;


fun main() {
    println("${lambda4.invoke(1, 2)}")
    println("${lambda4(1, 2)}")
}


③ Lambda 表达式调用 执行结果 : 两种调用方式实现的效果是一样的 ;


计算 : a + b = 3
3
计算 : a + b = 3
3


VI . Lambda 表达式完整语法示例 ( 声明 | 实现 | 调用 )


Lambda 表达式完整示例 : 下面的示例中 , 分别声明了 5 55 种不同类型的 Lambda 表达式示例 , 并使用不同的方法进行调用 ;



// 1 . 无参数 Unit 空类型返回值的 Lambda 表达式
var lambda1 : ()-> Unit = { println("lambda1") }
// 2 . Int 类型参数 , Int 类型返回值 , 的 Lambda 表达式
var lambda2 : (Int)-> Int = { a : Int -> a + 1000}
// 3 . 多行代码的 Lambda 表达式, 最后一行是返回值
var lambda3 : (Int)-> Int = { a : Int ->
    println("lambda3 多行代码")
    a + 1000
}
// 4 . 多个参数的 Lambda 表达式
var lambda4 : (Int, Int)->Int = { a : Int, b : Int ->
    println("计算 : a + b = ${a + b}")
    a + b
}
// 5 . Lambda 表达式类型作为参数的 Lambda 表达式 , 第 3 个参数是 Lambda 表达式类型的参数
var lambda5 : (Int, Int, (Int, Int)->Int)->Int = { a : Int, b : Int, c : (Int, Int)->Int ->
    println("计算 : a + b = ${c.invoke(a, b)}")
    c.invoke(a, b)
}
fun main() {
    //1 . 调用 无参数 Unit 空类型返回值的 Lambda 表达式 , 分别用两种形式进行调用
    println("\n执行 lambda1 调用 : \n")
    println("${lambda1.invoke()}")
    println("${lambda1()}")
    //2 . Int 类型参数 , Int 类型返回值 , 的 Lambda 表达式
    println("\n执行 lambda2 调用 : \n")
    println("${lambda2.invoke(100)}")
    println("${lambda2(100)}")
    //3 . 调用 多行代码的 Lambda 表达式
    println("\n执行 lambda3 调用 : \n")
    println("${lambda3.invoke(200)}")
    println("${lambda3(200)}")
    //4 . 调用 多个参数的 Lambda 表达式
    println("\n执行 lambda4 调用 : \n")
    println("${lambda4.invoke(1, 2)}")
    println("${lambda4(1, 2)}")
    //5 . 调用 Lambda 表达式类型作为参数的 Lambda 表达式 , 第 3 个参数是 Lambda 表达式类型的参数
    println("\n执行 lambda5 调用 : \n")
    println("${lambda5.invoke(3 , 4 , lambda4)}")
    println("${lambda5(3 , 4 , lambda4)}")
}




执行结果 :


执行 lambda1 调用 : 
lambda1
kotlin.Unit
lambda1
kotlin.Unit
执行 lambda2 调用 : 
1100
1100
执行 lambda3 调用 : 
lambda3 多行代码
1200
lambda3 多行代码
1200
执行 lambda4 调用 : 
计算 : a + b = 3
3
计算 : a + b = 3
3
执行 lambda5 调用 : 
计算 : a + b = 7
计算 : a + b = 7
计算 : a + b = 7
7
计算 : a + b = 7
计算 : a + b = 7
计算 : a + b = 7
7




目录
相关文章
|
4月前
|
安全 Java Kotlin
Kotlin泛型:灵活的类型参数化
Kotlin泛型:灵活的类型参数化
|
2月前
|
Java 开发者 Kotlin
|
2月前
|
存储 Java Kotlin
Kotlin 布尔值教程:深入理解与应用示例
Kotlin中的布尔值是一种数据类型,仅能存储`true`或`false`两种状态,适用于表示二选一的情况,如开关或真假判断。布尔类型可通过`Boolean`关键字声明,并直接赋值为`true`或`false`。此外,Kotlin支持使用比较运算符创建布尔表达式,用于条件判断。条件语句包括`if`、`else`和`else if`,允许根据不同条件执行特定代码块。特别地,在Kotlin中,`if..else`结构不仅能作为语句使用,还能作为表达式,即可以在条件判断的同时返回一个值。这种灵活性使得Kotlin在处理条件逻辑时更为简洁高效。
37 1
|
3月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
43 6
|
3月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
52 6
|
4月前
|
存储 Kotlin
Kotlin中的内联函数:提升性能与解决Lambda表达式参数问题
Kotlin中的内联函数:提升性能与解决Lambda表达式参数问题
|
4月前
|
存储 开发者 Kotlin
Kotlin Lambda表达式与标准库中的高阶函数
Kotlin Lambda表达式与标准库中的高阶函数
|
3月前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式有哪些用法
Kotlin的Lambda表达式是匿名函数的简洁形式,常用于集合操作和高阶函数。基本语法是`{参数 -> 表达式}`。例如,`{a, b -> a + b}`是一个加法lambda。它们可在`map`、`filter`等函数中使用,也可作为参数传递。单参数时可使用`it`关键字,如`list.map { it * 2 }`。类型推断简化了类型声明。
20 0
|
3月前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
26 0
|
4月前
|
Java Kotlin
Kotlin 中的 with 函数简介
Kotlin 中的 with 函数简介
204 0
下一篇
无影云桌面