kotlin学习 lambda编程

目录

集合

list

listOf创建一个不可变的集合。无法对集合进行添加、修改或删除。

kotlin 复制代码
    val list =listOf("张三","李四","王五")

mutableListOf创建一个可变的集合

kotlin 复制代码
    val list2 =mutableListOf("张三","李四","王五")

set集合与上面类似。setof()和mutableSetOf()。

Map

kotlin 复制代码
    val map = HashMap<String, Int>()
    map["张三"] = 1
    map["李四"] = 2
    map["王五"] = 3

从map中读取一条数据。

kotlin 复制代码
val number = map["张三"]

kotlin也提供了mapOf()和mutableMapOf()。

使用mapOf

kotlin 复制代码
   val map2 = mapOf("张三" to 1 , "李四" to 2 ,"王五" to 3)

使用mutableMapOf

kotlin 复制代码
    val map3 = mutableMapOf("张三" to 1 , "李四" to 2 ,"王五" to 3)

集合的函数式api

lambda语法结构:

kotlin 复制代码
{参数名1:参数类型,参数名2:参数类型 -> 函数体}

list.maxBy

找出最长的名字

kotlin 复制代码
    val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val maxName = list.maxBy { it.length }
    println(maxName)
kotlin 复制代码
gong sun wu ji

Process finished with exit code 0

maxBy接受lambda参数,上面不明显,下面的示例,就容易看出来了。

kotlin 复制代码
    val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val l = {name :String ->name.length}//lambda
    val maxName = list.maxBy(l)
    println(maxName)

list.map()

map()将集合中的每个元素都映射成另外的值,生成一个新的集合。

转化成大写

kotlin 复制代码
    val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val  newList = list.map { it.uppercase(Locale.ROOT) }
    println(newList)

结果

kotlin 复制代码
[ZHANG SAN, LI SI SI, GONG SUN WU JI]

Process finished with exit code 0

filter()

用来过滤集合里的数据。

kotlin 复制代码
    val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val  newList = list.filter { it.length <=10 }
    println(newList)

结果

kotlin 复制代码
[zhang san, li si si]

Process finished with exit code 0

any()

用于判断集合中是否至少存在一个元素满足指定条件。

kotlin 复制代码
  val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val aList = list.any{it.length <=10}
    println(aList)

结果

kotlin 复制代码
true

all

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

kotlin 复制代码
 val list = listOf("zhang san", "li si si", "gong sun wu ji")
    val allList = list.all { it.length <= 10 }
    println(allList)
kotlin 复制代码
false

java函数式api

在kotlin中调用java方法时可以使用函数式api,是有条件限制的,在kotlin代码中调用一个java方法,此方法有一个接口参数,且只有一个待实现方法,有多个待实现方法无法使用函数式api。

示例

kotlin 复制代码
    Thread(object : Runnable{
        override fun run() {
           
        }
    }).start()

kotlin创建匿名类需要使用object :

简化后

kotlin 复制代码
    Thread(Runnable{

    }).start()

如果一个java方法的参数列表中有且仅有一个java单抽象方法接口参数,可以将接口名省略。

kotlin 复制代码
    Thread( {

    }).start()

当lambda表达式是方法的最后一个参数,可以将lambda表达式到方法括号的外面。如果lambda表达式还是方法的唯一一个参数。可以将方法的括号省略。如下:

kotlin 复制代码
    Thread {
    
    }.start()

空指针检查

kotlin将空指针异常的检查提前到了编译时期。

可控类型系统,在类名的后面加上一个问号。

Int表示不为空的整形,Int?表示可为空的整形。String表示不可为空的字符串,String?表示可为空的字符串。

判空辅助工具

?. 当对象不为空时正常调用,当对象为空时,什么都不做。

示例

kotlin 复制代码
    if(s!=null){

        s.test()
    }

使用?.后

kotlin 复制代码
 s?.test()

?:操作符

左右两边都接受一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。

kotlin 复制代码
val a = if(b  == 1){
	b
}else{
	c
}

使用?:

kotlin 复制代码
val a = b?:c

!! 非空断言工具

kotlin空指针检查机制并不是太智能,从逻辑上已经将空指针异常处理了,但是编译还是失败。

kotlin 复制代码
var content:String? = "test";

fun main() {

    if(content !=null){

        printAdd()
    }
}

fun printAdd(){

    val nc = content.toUpperCase()
    println(nc)
}

上面这段代码是不能运行的,这种情况就需要强行通过编译了,使用!!。

kotlin 复制代码
fun printAdd(){

    val nc = content!!.toUpperCase()
    println(nc)
}

let函数

将原始调用对象作为参数传递到lambda表达式中。

kotlin 复制代码
obj.let{obj2->

}

下面举个代码的例子,便于理解let的优势。

kotlin 复制代码
interface Draw {

    fun paintTree()
    fun paintFish()
}

fun paint(draw: Draw?) {

    draw?.paintFish()
    draw?.paintTree()
}

上面这个代码可以正常运行,转换成if判断

kotlin 复制代码
fun paint(draw: Draw?) {

    if(draw != null){

        draw.paintFish()
    }

    if(draw != null){

        draw.paintTree()
    }
}

可以看出每次使用draw对象时,都要进行一次if判断。这个时候就可以使用let函数和?.操作符来优化了。

kotlin 复制代码
    draw?.let { dr->
        dr.paintTree()
        dr.paintFish()
    }

draw不为空时,就调用let函数,let函数会将draw对象传入到lambda中,dr对象肯定不为空。只有一个参数,省略声明参数名,使用it。

kotlin 复制代码
fun paint(draw: Draw?) {

    draw?.let {
        it.paintTree()
        it.paintFish()
    }
}

let函数可以处理全局变量的判空问题,if判断无法做到。

kotlin 复制代码
var draw: Draw? = null

fun paint() {

    if(draw !=null){

        draw.paintTree()
        draw.paintFish()
    }
}

这段代码会报错,是因为全局变量的值随时可能会被其他线程修改。即使做了判空处理,仍然无法保证if语句中的draw变量没有空指针风险。

相关推荐
TA远方34 分钟前
【Android】adb常用的命令用法详解
android·adb·管理·控制·命令
好奇龙猫6 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
saoys6 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
电子小白1237 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
唯情于酒7 小时前
Docker学习
学习·docker·容器
贺biubiu8 小时前
2025 年终总结|总有那么一个人,会让你千里奔赴...
android·程序员·年终总结
xuekai200809018 小时前
mysql-组复制 -8.4.7 主从搭建
android·adb
charlie1145141919 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
资生算法程序员_畅想家_剑魔9 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin
IT=>小脑虎9 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习