当前位置: 首页 > news >正文

kotlin学习 lambda编程

目录

    • 集合
      • list
      • Map
    • 集合的函数式api
      • list.maxBy
      • list.map()
      • filter()
      • any()
      • all
      • java函数式api
    • 空指针检查
      • 判空辅助工具
      • ?:操作符
      • !! 非空断言工具
      • let函数

集合

list

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

    val list =listOf("张三","李四","王五")

mutableListOf创建一个可变的集合

    val list2 =mutableListOf("张三","李四","王五")

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

Map

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

从map中读取一条数据。

val number = map["张三"]

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

   val map2 = mapOf("张三" to 1 , "李四" to 2 ,"王五" to 3)

使用mutableMapOf

    val map3 = mutableMapOf("张三" to 1 , "李四" to 2 ,"王五" to 3)

集合的函数式api

lambda语法结构:

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

list.maxBy

找出最长的名字

    val list = listOf("zhang san", "li si si", "gong sun wu ji")val maxName = list.maxBy { it.length }println(maxName)
gong sun wu jiProcess finished with exit code 0

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

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

list.map()

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

转化成大写

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

结果

[ZHANG SAN, LI SI SI, GONG SUN WU JI]Process finished with exit code 0

filter()

用来过滤集合里的数据。

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

结果

[zhang san, li si si]Process finished with exit code 0

any()

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

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

结果

true

all

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

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

java函数式api

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

    Thread(object : Runnable{override fun run() {}}).start()

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

    Thread(Runnable{}).start()

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

    Thread( {}).start()

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

    Thread {}.start()

空指针检查

kotlin将空指针异常的检查提前到了编译时期。
可控类型系统,在类名的后面加上一个问号。
Int表示不为空的整形,Int?表示可为空的整形。String表示不可为空的字符串,String?表示可为空的字符串。

判空辅助工具

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

    if(s!=null){s.test()}

使用?.后

 s?.test()

?:操作符

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

val a = if(b  == 1){b
}else{c
}

使用?:

val a = b?:c

!! 非空断言工具

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

var content:String? = "test";fun main() {if(content !=null){printAdd()}
}fun printAdd(){val nc = content.toUpperCase()println(nc)
}

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

fun printAdd(){val nc = content!!.toUpperCase()println(nc)
}

let函数

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

obj.let{obj2->}

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

interface Draw {fun paintTree()fun paintFish()
}fun paint(draw: Draw?) {draw?.paintFish()draw?.paintTree()
}

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

fun paint(draw: Draw?) {if(draw != null){draw.paintFish()}if(draw != null){draw.paintTree()}
}

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

    draw?.let { dr->dr.paintTree()dr.paintFish()}

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

fun paint(draw: Draw?) {draw?.let {it.paintTree()it.paintFish()}
}

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

var draw: Draw? = nullfun paint() {if(draw !=null){draw.paintTree()draw.paintFish()}
}

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

http://www.dtcms.com/a/560726.html

相关文章:

  • 如何写好汇报材料经验总结
  • 百度收录的网站标题 --专业做公司网站的机构
  • 视频时间戳PTS和DTS的区别
  • 09-神经网络的结构:描述神经网络的层次化组成和设计
  • 【ComfyUI】Stable Audio 文本生成音频
  • 音视频入门核心概念:容器、编码、流与时间戳
  • 网站的域名每年都要续费建个什么网站赚钱
  • 建站之星破解版在下列软件中
  • RocketMQ之长轮训机制
  • 论文阅读-EfficientAD
  • 跟der包学习java_day6「面向对象编程(OOP)」
  • 好的企业管理网站深圳市中心
  • 阿克苏建设局网站wordpress app
  • 使用 Ksycopg2 驱动实现 Kingbase 数据库增删改查系统
  • released信号,windowIcon/setWindowIcon(QIcon),qrc机制
  • 等价多米诺骨牌对的数量(C语言)
  • Python pandas数据透视表(pivot_table)详解:从入门到实战,多维数据分析利器
  • 江西新余网站建设网站建设页面设计规格
  • ATPrompt:基于属性的视觉提示
  • 手机如何制作网站教程网站双线选择
  • upload文件上传漏洞浅析
  • GitHub 热榜项目 - 日榜(2025-11-02)
  • 网站稿件管理发布系统中山网站建设半江红
  • 【Qt开发】布局管理器(二)-> QHBoxLayout水平布局
  • Linux 6.17:最新的驱动程序、快速的网络和可靠的内存
  • 【Ubuntu】虚拟机 Ubuntu 挂载 宿主机 Windows文件夹
  • 将go-tcp项目部署到docker容器下运行
  • 华为OD机试双机位A卷 - 几何平均值最大的子数组 (C++ Python JAVA JS GO)
  • PostgreSQL死锁排查攻略:从日志分析到实时监控
  • 佛山响应式网站开发二级域名免费分发站