首页 > 编程语言 >Kotlin Lambda编程

Kotlin Lambda编程

时间:2023-01-13 11:15:28浏览次数:41  
标签:函数 val Kotlin 编程 list fruit 集合 Lambda

许多现代高级编程语言在很早之前就开始支持Lambda编程了,但是Java却直到JDK 1.8之后才加入了Lambda编程的语法支持。

而Kotlin从第一个版本开始就支持了Lambda编程,并且Kotlin中的Lambda功能极为强大,甚至认为Lambda才是Kotlin的灵魂所在。

集合的创建与遍历

传统意义上的集合主要就是List和Set,再广泛一点的话,像Map这样的键值对数据结构也可以包含进来。

// Kotlin专门提供了一个内置的listOf()函数来简化初始化集合的写法
// listOf()函数创建的是一个不可变的集合
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
for (fruit in list) {
    println(fruit)
}
// 创建一个可变的集合呢?也很简单,使用mutableListOf()函数就可以了
val list2 = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
list2.add("Watermelon")
for (fruit in list2) {
    println(fruit)
}

// Set集合的用法几乎与此一模一样,只是将创建集合的方式换成了setOf()和mutableSetOf()函数
val set = setOf("Apple", "Banana", "Orange", "Pear", "Grape")
for (fruit in set) {
    println(fruit)
}

//Map是一种键值对形式的数据结构,因此在用法上和List、Set集合有较大的不同。
val map = HashMap<String, Int>()
map.put("Apple", 1)
map.put("Banana", 2)
map.put("Orange", 3)
// 在Kotlin中并不建议使用put()和get()方法来对Map进行添加和读取数据操作,而是更加推荐使用一种类似于数组下标的语法结构
val map2 = HashMap<String, Int>()
map2["Apple"] = 1
map2["Banana"] = 2
map2["Orange"] = 3
// 当然,这仍然不是最简便的写法,因为Kotlin毫无疑问地提供了一对mapOf()和mutableMapOf()函数来继续简化Map的用法。
// 在mapOf()函数中,我们可以直接传入初始化的键值对组合来完成对Map集合的创建:
val map3 = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
//这里的键值对组合看上去好像是使用to这个关键字来进行关联的,但其实to并不是关键字,而是一个infix函数
for ((fruit, number) in map3) {
    println("fruit is " + fruit + ", number is " + number)
}

集合的函数式API

集合的函数式API有很多个,重点学习函数式API的语法结构,也就是Lambda表达式的语法结构。

Lambda的定义

如果用最直白的语言来阐述的话,Lambda就是一小段可以作为参数传递的代码。从定义上看,这个功能就很厉害了,因为正常情况下,我们向某个函数传参时只能传入变量,而借助Lambda却允许传入一小段代码。这里两次使用了“一小段代码”这种描述,那么到底多少代码才算一小段代码呢?Kotlin对此并没有进行限制,但是通常不建议在Lambda表达式中编写太长的代码,否则可能会影响代码的可读性。

Lambda表达式的语法结构

{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

这是Lambda表达式最完整的语法结构定义。首先最外层是一对大括号,如果有参数传入到Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用一个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码(虽然不建议编写太长的代码),并且最后一行代码会自动作为Lambda表达式的返回值。

简化的写法

当然,在很多情况下,并不需要使用Lambda表达式完整的语法结构,而是有很多种简化的写法。

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
//这个Lambda参数是完全按照刚才学习的表达式的语法结构来定义的
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)
//不需要专门定义一个lambda变量,而是可以直接将lambda表达式传入maxBy函数当中
val maxLengthFruit2 = list.maxBy({ fruit: String -> fruit.length })
//如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略:
val maxLengthFruit3 = list.maxBy { fruit: String -> fruit.length }
//由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下不必声明参数类型
val maxLengthFruit4 = list.maxBy { fruit -> fruit.length }
//当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替
val maxLengthFruit5 = list.maxBy { it.length }
println("max length fruit is " + maxLengthFruit)

其实maxBy就是一个普通的函数而已,只不过它接收的是一个Lambda类型的参数,并且会在遍历集合时将每次遍历的值作为参数传递给Lambda表达式。maxBy函数的工作原理是根据我们传入的条件来遍历集合,从而找到该条件下的最大值

接下来就再来学习几个集合中比较常用的函数式API

map函数

集合中的map函数是最常用的一种函数式API,它用于将集合中的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合。

fun main() {
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
    val newList = list.map { it.toUpperCase() }
    for (fruit in newList) {
        println(fruit)
    }
}

filter函数

顾名思义,filter函数是用来过滤集合中的数据的,它可以单独使用,也可以配合刚才的map函数一起使用。

fun main() {
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
    val newList = list.filter { it.length <= 5 }.map { it.toUpperCase() }
    for (fruit in newList) {
        println(fruit)
    }
}

any和all函数

其中any函数用于判断集合中是否至少存在一个元素满足指定条件,all函数用于判断集合中是否所有元素都满足指定条件。

fun main() {
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
    val anyResult = list.any { it.length <= 5 }
    val allResult = list.all { it.length <= 5 }
    println("anyResult is " + anyResult + ", allResult is " + allResult)
}

  

 

Java函数式API的使用

 

标签:函数,val,Kotlin,编程,list,fruit,集合,Lambda
From: https://www.cnblogs.com/ooo0/p/17048907.html

相关文章

  • Kotlin 变量和函数
    编程之本:变量和函数变量Kotlin中定义一个变量,只允许在变量前声明两种关键字:val和var。val(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新......
  • Kotlin 逻辑控制
    程序的逻辑控制 if条件语句Kotlin中的if语句相比于Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。funlargerNumber(nu......
  • 读编程与类型系统笔记06_函数类型的高级应用
    1. 装饰器模式1.1. 扩展对象的行为,而不必修改对象的类1.2. 装饰的对象可以执行其原始实现没有提供的功能1.3. 优势1.3.1. 支持单一职责原则1.3.1.1. 每个类只......
  • JDBC编程2
      准备一个表:1.建立表结构,表名bank_account列名类型约束备注idint主键,自增主键numvarchar(32)非空,唯一银行账号,自然主......
  • JDBC编程
      准备一个表:1.建立表结构,表名bank_account列名类型约束备注idint主键,自增主键numvarchar(32)非空,唯一银行账号,自然主......
  • Unix环境高级编程-01:环境配置和第一个ls程序
    环境配置和第一个ls程序一、环境配置下载apue3的代码(apue表示Unix环境高级编程的英文简写,3表示第三版)下载地址:http://www.apuebook.com/src.3e.tar.gz,书籍地址:http://w......
  • 为什么我放弃Java,选择Kotlin(靠特灵)?
    今天查了一下,竟然发现Oracle的JDK听说是收费了。也就是说,你要用于生产环境的话,Oracle一旦查到你,你就要交钱的。我本身是个穷光蛋,哪还有钱交给Oracle。为了避免繁琐的法律制......
  • 场景编程集锦 - 世界那么大,我想去看看
    场景描述  “世界那么大,我想去看看”。这句话出自于一位中学老师的辞职申请,整个辞职信只有短短10个字,它被喻为史上最具情怀的辞职信。如此任性的辞职信,领导最后真批准了......
  • 一个并发编程中线程同步和同步锁的问题
    (一个并发编程中线程同步和同步锁的问题)1.线程安全问题经典问题——银行取钱问题里面的核心问题(1)用户输入账户、密码并判断(2)输入取款金额(3)判断余额与取款金额孰多......
  • sikulix___自动化办公___重复性_机械性_的电脑操作___python脚本___Java运行环境下德j
    sikulix___自动化办公___重复性_机械性_的电脑操作___python脚本___Java运行环境下德jar包完成自动化测试相关___截图编程控制键盘鼠标  应用场景:      公司......