Kotlin小笔记Lambda和集合的函数API

Posted Rose J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin小笔记Lambda和集合的函数API相关的知识,希望对你有一定的参考价值。

本文目录

Lambda

集合

1.list

kotlin初始化集合

 `       val list = listOf("Apple","Pear")
    for (fruit in list)
        println(fruit)
    `

不可变的集合–只能取

可变集合 -mutableListOf

  `  val list = mutableListOf("","")`

2.set

和set一样

3.map

添加

map[“Apple”]=1

读取

val number = map[“Apple”]

示例

val map=HashMap<String,Int>()
        map["Apple"]=1

更加简洁写法,键值对读取

`

val map2 = mapOf(“Apple” to 1)

for ((fruit,number) in map2)

    `

集合的函数API

1.list

在一个水果集合中找到单词最长的那个水果

val list = listOf("Apple","Pear","Orange")
        val maxLengthFruit= list.maxByOrNull  it.length 
        Log.i("check11",maxLengthFruit.toString() ) 

Lambda表达式的语法结构

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

->表示参数列表的结束,以及函数体的开始,函数体中可以编写任意行代码(不要太长,最后一行代码会自动作为Lambda表达式的返回值

对上面代码套用Lambda

fun main() 
    val list = listOf("Apple","Pear","Orange")
    val lambda =fruit:String -> fruit.length
    val maxLengthFruit =list.maxByOrNull(lambda)
    println(""+maxLengthFruit)
    

简化lambda变量的声明

 val maxLengthFruit =list.maxByOrNull(fruit:String -> fruit.length)

根据kotlin规定,lambda参数是函数的最后一个参数的话,可以将lambda表达式移到函数括号的外面,如下

  val maxLengthFruit =list.maxByOrNull()fruit:String -> fruit.length

接下来,如果lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略

val maxLengthFruit =list.maxByOrNullfruit:String -> fruit.length

由于kotlin的推导机制,可以不用声明参数类型

val maxLengthFruit =list.maxByOrNullfruit -> fruit.length

最后,lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键词来代替

val maxLengthFruit =list.maxByOrNullit.length

通过推导,得到函数API的写法

2.map

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

例如:让所有水果名转为大写

fun main() 
    val list = listOf("Apple","Pear","Orange")
    val newList =list.mapit.toUpperCase()
    for(fruit in newList)
    println(fruit)
        
    
        
输出:
APPLE
PEAR
ORANGE    

map函数功能很强大,他可以按照我们的需求对集合中的元素进行任意的映射转换,除了上面以外,还可以转成小写,或者只取单词的首字母,甚至转成单词长度这样一个数字集合,只要在Lambda表达式中编写你需要的逻辑即可。

3. filter

例如:保留5个字母以内的水果,可以用 filter 函数实现

fun main() 
    val list = listOf("Apple","Pear","Orange")
    val newList =list.mapit.toUpperCase()
    for(fruit in newList)
    println(fruit)
        
    
    输出:
    Apple
    Pear

配合map使用

fun main() 
    val list = listOf("Apple","Pear","Orange")
    val newList =list.mapit.toUpperCase()
    for(fruit in newList)
    println(fruit)
        
    
    输出:
    APPLE
    PEAR

先filter函数再调用map函数,如果先map函数效率会差很多,因为这样相当于要对集合中的所有元素进行一次映射转换再进行过滤。相反,效率会高效很多、

4.any和all

any函数:用于判断集合中石是否至少存在一个元素满足指定条件

all函数:用于判断集合中是否所有元素都满足指定条件

fun main() 
    val list = listOf("Apple","Pear","Orange","Watermelon")
    val anyResult =list.anyit.length <= 5
    val allResult =list.allit.length <= 5
    
  
    println("anyResult is " + anyResult+", allResult is" + allResult)
        
 

输出:
anyResult is true, allResult isfalse

Java函数式API的使用

1.匿名类

Thread(object :Runnable
    override fun run() 
        TODO("Not yet implemented")
    
).start()

Kotlin的匿名类

Thread(Runnable

        TODO("Not yet implemented")
    
).start()

简化,因为Runnable类中只有一个待实现方法,即使这里 没有显示的重写run方法,kotlin也可以自动明白Runnable后面的lambda表达式就是要在run方法中实现的内容

Thread 

    TODO("Not yet implemented")

.start()

当Lambda表达式是方法中的最后一个参数时,可以将Lambda表达式移到方法括号的外面,然后省掉()

以上是关于Kotlin小笔记Lambda和集合的函数API的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin之高阶函数

《Kotlin核心编程》笔记:函数和Lambda表达式

Kotlin 学习笔记—— 基本类型函数lambda类与对象的写法

kotlin方法传入lambda表达式参数并调用invoke什么意思

Kotlin学习

kotlin学习笔记之Lambda表达式